C# WPF上位机开发(多线程处理)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

多线程是软件开发绕不开的一个题目。从前cpu还是单核的时候,多线程可以帮助我们有效解决io阻塞的难题。而现在,cpu已经从单核变成了多核,这个时候多线程可以真正发挥多核的优势了。当然,不管是为了解决io阻塞,还是为了并发多核,多线程本身还是非常实用的。很多面试的时候,多线程和网络这两个知识点,也成为面试官区别一般程序员和高级程序员的一个重要条件。

c# wpf本身使用多线程还是很方便的,引入命名空间后,直接调用相关的类即可。本次实验主要在于演示,介绍如何利用多线程实现界面的更新。

1、界面设计

界面设计相对来说不复杂,就是一个按钮和一个textbox。按钮被按下去之后,会启动一个线程,每个一段时间,textbox会更新一段内容。等所有内容都打印完毕之后,会有一个任务完成的提示。

<Window x:Class="WpfApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:local="clr-namespace:WpfApp"
        mc:Ignorable="d"
        Title="MultiThreadDemo" Height="480" Width="550">
    <Grid>
        <StackPanel>
            <Button x:Name="button"  Content="Start Thread" Click="StartThreadButton_Click" Height="40" Margin="5,40"/>
            <TextBox x:Name="ResultTextBox" TextWrapping="Wrap" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" Height="200" Margin="5"/>
        </StackPanel>
    </Grid>
</Window>

效果如下所示,

2、代码实现

有了界面时候,下面就要开始编写代码了。代码部分需要实现的,主要是按钮的回调函数。这里需要注意下,就是按钮被按下去之后,函数已经开始响应,此时按钮本身需要灰化,防止再次被按下。

在按钮的回调函数中,我们可以启动一个thread。在这个thread当中,每隔500ms更新一下textbox。当然更新的方法肯定是利用Dispatcher.Invoke来完成的。等到所有的打印都结束之后,最后输出提示工作已经完成,按钮恢复成可以单击的状态。

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Threading;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void StartThreadButton_Click(object sender, RoutedEventArgs e)
        {
            Thread newThread = new Thread(new ThreadStart(WorkerThreadMethod));
            newThread.Start();
            button.IsEnabled = false;
        }

        private void WorkerThreadMethod()
        {
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(500);
                
                Application.Current.Dispatcher.Invoke(() =>
                {
                    ResultTextBox.AppendText($"执行第 {i + 1} 步...\n");
                });
            }
            
            Application.Current.Dispatcher.Invoke(() =>
            {
                ResultTextBox.AppendText("工作完成!\n");
                button.IsEnabled = true;
            });
        }
    }
}

3、编译测试

编译测试其实就蛮简单了。在编译无误之后,单击检测一下,是不是textbox中有定时打印,并且所有步骤都结束后,是不是有工作完成的提示,如果以上的内容都存在,那说明基本是没有问题的。反之,则要去继续debug和分析了。

相关推荐
Watermelo617几秒前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
军训猫猫头1 小时前
20.抽卡只有金,带保底(WPF) C#
ui·c#·wpf
半盏茶香1 小时前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
明耀1 小时前
WPF 设置平均布局 如果隐藏的话,能够自动扩展
wpf
Evand J2 小时前
LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度
开发语言·matlab
LucianaiB2 小时前
探索CSDN博客数据:使用Python爬虫技术
开发语言·爬虫·python
Ronin3052 小时前
11.vector的介绍及模拟实现
开发语言·c++
计算机学长大白3 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
PieroPc4 小时前
Python 写的 智慧记 进销存 辅助 程序 导入导出 excel 可打印
开发语言·python·excel
2401_857439697 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php