WPF 多线程编程

WPF入门教学二十二 多线程与异步编程 在WPF(Windows Presentation Foundation)中,多线程和异步编程是非常重要的概念,因为它们可以帮助你创建响应性更好的应用程序。WPF的UI线程负责处理所有的用户界面操作,如果你的代码在UI线程上执行耗时操作,那么UI将会冻结,用户体验会很差。因此,学会如何在WPF中使用多线程和异步编程是非常关键的。 阅读详情


-----------


using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Linq;
using System.Threading;
using System.Windows;
using System.Windows.Threading;

namespace MultiThread
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 消息事件
        /// </summary>
        private event EventHandler MessaegRecevied = delegate {};

        /// <summary>
        /// 线程消息
        /// </summary>
        readonly List<string> _threadMsg = new List<string>();

        /// <summary>
        /// 消息互斥锁
        /// </summary>
        Mutex _mutex = new Mutex();

        /// <summary>
        /// 写入消息
        /// </summary>
        /// <param name="msg"></param>
        private void PushMessage(string msg)
        {
            _mutex.WaitOne();
            _threadMsg.Add(msg);
            //TODO
            Debug.WriteLine(msg);
            _mutex.ReleaseMutex();
        }

        /// <summary>
        /// 弹出消息
        /// </summary>
        /// <returns></returns>
        private string PopMessage()
        {
            string ret = null;
            _mutex.WaitOne();
            if (_threadMsg.Count > 0)
            {
                ret = _threadMsg[0];
                _threadMsg.RemoveAt(0);
            }
            _mutex.ReleaseMutex();
            return ret;
        }

        /// <summary>
        /// 线程列表
        /// </summary>
        List<Thread> _threads = new List<Thread>();

        /// <summary>
        /// 构造
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();
            MessaegRecevied += OnMessaegRecevied;

            //
            var t = new DispatcherTimer();
            t.Tick += UpdateMessage;
            t.IsEnabled = true;
            t.Start();
        }

        /// <summary>
        /// 收到消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnMessaegRecevied(object sender, EventArgs e)
        {
            //TODO
            //Debug.WriteLine(PopMessage());
        }

        /// <summary>
        /// 更新消息控件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void UpdateMessage(object sender, EventArgs e)
         {
             //这里面不知道多线程访问是怎么实现的,回来再看
             richTextBox1.AppendText(PopMessage());
            richTextBox1.ScrollToEnd();
         }

        /// <summary>
        /// 是否启动
        /// </summary>
        private bool _bStarted = false;

        /// <summary>
        /// 启动的线程数
        /// </summary>
        private const int ThreadNumber = 2;

        /// <summary>
        /// 启动多线程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            //已经启动
            if (_bStarted)return;

            _bStarted = true;

            //创建
            for (var i = 0; i < ThreadNumber; i++)
            {
                _threads.Add(new Thread(new ThreadStart(Run)));
            }

            //启动
            foreach (var thread in _threads)
            {
                thread.Start();
            }

            UpdateUi();
        }

        /// <summary>
        /// 更新界面
        /// </summary>
        private void UpdateUi()
        {
            //显示
            listView1.ItemsSource = _threads.Select(obj => new
            {
                Name = obj.Name,
                ThreadState = obj.ThreadState,
                ManagedThreadId = obj.ManagedThreadId,
            });
        }

        /// <summary>
        /// 线程回调
        /// </summary>
        public void Run()
        {
            while (true)
            {
                PushMessage(Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture)+" 发来消息");
                Thread.Sleep(200);
            }
// ReSharper disable FunctionNeverReturns
        }
// ReSharper restore FunctionNeverReturns

        /// <summary>
        /// 窗口关闭
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            DestroyThreads();
        }

        /// <summary>
        /// 关闭线程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, RoutedEventArgs e)
        {
            DestroyThreads();
        }

        /// <summary>
        /// 销毁线程
        /// </summary>
        private void DestroyThreads()
        {
            //销毁
            for (int index = _threads.Count-1; index>=0; index--)
            {
                var thread = _threads[index];
                thread.Abort();
                _threads.Remove(thread);
            }

            UpdateUi();

            _bStarted = false;
        }

        /// <summary>
        /// 退出
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button3_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
    }
}
新手学WPF





123





        
【朝夕教育】2023年09月 WPF+上位机+工业互联 094-多线程的基本使用 多线程是一种程序设计模式,它允许单个程序同时执行多个任务。在多线程编程中,程序被分成不同的线程,每个线程都是独立运行的,并且可以同时执行不同的任务。相比于单线程程序,在多线程程序中,可以更高效地利用计算机的资源,提高程序的执行速度和响应能力。多线程常用于并发编程、网络编程、图形界面编程等领域。 阅读详情

相关推荐

WPF高级 | WPF 多线程编程:提升应用性能与响应性

WPF高级 | WPF 多线程编程:提升应用性能与响应性,在现代应用程序开发中,用户对于应用的性能和响应性有着极高的要求。Windows Presentation Foundation(WPF)作为一款强大的图形界面开发框架,为开发者提供了丰富的功能来创建交互性强的应用程序。然而,当应用程序需要处理复杂的计算任务、大量的数据读取或网络请求时,单线程的执行模式可能会导致界面卡顿,影响用户体验。多线程编程技术为解决这些问题提供了有效的途径,它允许应用程序同时执行多个任务,从而提升性能和响应性。本文将深入^

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

WPF上位机6——文件操作、多线程、线程锁、Task异步编程

文件操作 文件夹操作 创建文件夹 磁盘信息 文件的读写 文件流 Thread多线程 带参数创建线程 Task多线程 创建方式1 第一种 第二种 第三种:线程池的方式 前台与后台线程

qq_42832272的博客 965

96、WPF与Windows Forms交互及多线程编程

本文探讨了WPF与Windows Forms之间的交互机制,包括如何通过ElementHost和WindowsFormsHost嵌入内容、处理键盘焦点问题以及属性映射的实现。同时,深入介绍了WPF中的多线程编程模型,涉及调度器、DispatcherObject类的使用及多线程注意事项,并提供了插件开发的基本流程和示例,帮助开发者构建响应性强且可扩展的应用程序。

oo7890的博客 64

【WPF】多线程Demo

程序框架主界面:主窗体xaml:<Grid Background="#FFDEDED4"> <TextBox x:Name="txtCountThreads" HorizontalAlignment="Left" Height="45" Margin="31,23,0,0" Text="7" TextWrapping="Wrap" VerticalAlignmen...

cxyhjl的博客 472

WPF与WinForm对比 - 多线程编程优化是关键

WPF是一种更现代化、功能更强大的框架,它使用XAML(可扩展应用程序标记语言)来定义用户界面,可以实现更丰富的图形效果和动画。总结起来,WPF和WinForms都是强大的桌面应用程序开发框架,而在后端开发中,多线程编程的优化是至关重要的。在使用WPF或WinForms进行后端开发时,多线程编程优化是确保应用程序性能和用户体验的关键。通过使用异步编程模型、后台线程、线程池和任务并行库,可以有效地管理和调度多个并发任务,从而提高应用程序的响应性和效率。然而,优化多线程编程是确保应用程序性能和响应性的关键。

OyLinux的博客 522

25、WPF中的设计模式与多线程编程

本博客深入探讨了WPF开发中的设计模式与多线程编程技术。内容涵盖常见呈现模式(如MVVM和MVP)的用途与选择策略,多线程与异步操作的基本原理及其在提升UI响应性中的应用。详细分析了多线程与异步操作的优缺点与适用场景,并通过代码示例演示了如何在WPF中实现多线程任务、使用异步委托和线程池。此外,还提供了性能对比、流程图及实际案例,帮助开发者根据任务类型选择合适的方法,确保应用程序的高性能与稳定性。

126

WPF 中的多线程编程模型

WPF 调度器 DispatcherWPF 每个元素都有用一个Dispatcher属性,Dispatcher会自动在线程池中按优先级对工作项进行排队和调度。通过该属性执行指定的委托,即可实现不同线程之间的交互,而不出现死锁问题。中常用的方法:Invoke(), InvokeAsync( )TextBox1.Dispatcher.Invoke( ...)TextBox1.Dispatcher.InvokeAsync( ...)Invoke( ) 方法是同步调用,即直到在线程池中实际执行完该委托它才返回。Inv

flysh05的专栏 818

C# WPF多线程编程实用案例解析

在现代软件开发中,WPF(Windows Presentation Foundation)是一个强大的框架,它为开发者提供了构建丰富用户界面的能力。WPF封装了复杂的图形系统、样式、动画以及文档功能于一身,提供了一种全新的方式来设计Windows桌面应用程序的外观和感觉。WPF主要基于XAML(可扩展应用程序标记语言)进行界面布局和设计,XAML是一种基于XML的标记语言,允许开发者通过声明式的方式定义UI元素、样式和布局,从而使设计者和开发者的工作分离更加清晰。

weixin_42113456的博客 1350

WPFSocket多线程编程示例代码:掌握WPF与Socket编程的利器

WPFSocket多线程编程示例代码:掌握WPF与Socket编程的利器 去发现同类优质开源项目:https://gitcode.com/ WPF Socket 多线程编程示例代码,轻松实现WPF环境下Socket通信及多线程处理。 项目介绍 在软件开发领域,WPF(Windows Presentation Foundation)和Socket编程是两个非常重要的概念。WPF提供了丰富的用户界面元...

gitblog_06711的博客 341

WPF多线程编程实战:深入理解与应用

htmltable {th, td {th {pre {简介:WPF应用程序利用多线程执行耗时操作而不阻塞UI,提供后台线程、Dispatcher、Task Parallel Library等多种多线程实现方式。本教程通过实例展示如何更新UI、利用异步数据加载、显示进度、处理异常、管理资源,并确保线程安全与性能优化。

weixin_42452483的博客 1385

WPF多线程实例

一个WPF多线程实例:两个列表listbox,每秒从第一个列表中随机抽取出一项,然后添加到第二个列表中,同时界面实现实时更新

WPF Socket 多线程编程示例代码

WPF Socket 多线程编程示例代码 去发现同类优质开源项目:https://gitcode.com/ 此仓库提供了WPF环境下使用Socket进行多线程编程的基础示例代码。请注意,这些代码较为简陋,且未经优化,适用于学习和研究目的。 简介 此代码示例旨在帮助开发者理解如何在WPF应用程序中实现Socket通信及多线程处理。代码直接、明了,但并未进行复杂的应用优化,适用于初学者作为参考。 使用...

gitblog_06757的博客 335

WPF多线程编程

WPF THREAG,WPF多线程编程,对异步执行与同步执行做了比较

WPF与WinForm对比多线程编程优化是关键

【IT168技术】很多人问过我这样一个问题:WPF和以前的WinForm有什么区别?  我之前的回答一直是:没什么区别,仅仅是表示层用XAML封了层皮,使得Windows看起来更炫了。  今天(确切的说是昨天),我终于发现了我肤浅。首先我要澄清一下,WPF较之WinForm的先进之处不止一点点。  对于WPF,很多人都以为这是微软的一个小玩具,充其量就是让Vista和Win7的表示层更炫了,然后就...

weixin_30764137的博客 233

wpf下多线程的例子

wpf下多线程的例子

操作系统课设 多线程并发执行 C# WPF

很实用 操作系统课设 多线程并发执行 C# 用WPF做界面 很漂亮 在VS2010上运行

(转)WPF与WinForm对比多线程编程优化是关键

很多人问过这样一个问题:WPF和以前的WinForm有什么区别?   我之前的回答一直是:没什么区别,仅仅是表示层用XAML封了层皮,使得Windows看起来更炫了。   今天(确切的说是昨天),我终于发现了我肤浅。首先我要澄清一下,WPF较之WinForm的先进之处不止一点点。   对于WPF,很多人都以为这是微软的一个小玩具,充其量就是让Vista和Win7的表示层更炫了,然后就会吸引...

weixin_30610755的博客 433

VirtualBox创建虚拟机(为安装Ubuntu桌面系统)

Ubuntu的安装非常灵活。但是万变不离其宗,归纳起来,无非就是以下3种:(1)用户可以下载完整的ISO镜像文件,将其转移到各种介质上面,例如DVD或者U盘,然后以该介质引导系统进行安装。(2)用户可以下载一个非常小的网络安装器,利用该安装器引导系统进行在线安装。(3)用户可以将Ubuntu安装到一个U盘中,随身携带。为了便于读者学习,本节将介绍通过完整的ISO镜像文件安装Ubuntu。其他的安装方式将在后面介绍。

夏天又到了的专栏 2687

【笔记】【WPF编程宝典】 第31章 多线程

了解多线程模型 多线程是指同时执行多块代码。多线程的目标通常是用于创建能够更好地进行响应的用户界面——当执行其他工作时不会冻结的用户界面——尽管当执行需要消耗大量的CPU时间的算法时,或者长时间执行其他工作时,也可以使用多线程更好地利用多核CPU的功能。WPF支持单线程单元(Single-Thread Apartment)模型,该模型与在Windows窗体应用程序中使用的模型非常类似。它具有以下...

zhy29563 706

一文带你了解SOA接口测试

了解汽车电子行业的人,近几年可能经常见到一个词“SOA”,那SOA具体是什么?作为测试人员应该要测试哪些内容呢?这篇文章就简单给大家介绍一下。SOA(Service Oriented Architecture)是一种面向服务的架构,最早应用于IT行业,虽然行业内对于SOA的定义没有一个统一的描述,但是总体而言,SOA把功能定义成为服务,服务带有明确的可调用接口,并可以通过网络调用。在汽车领域,对于高性能计算平台而言,为了实现域控制器以及区域控制器之间的互联互通和软硬分离、缩短开发周期等优势,也引入了SOA的

怿星科技的博客 7155

计算机网络实验六 RIP 配置实验

Man! What can I say?

AClerk的博客 1592
上一篇: C++ dll to C#
下一篇: Wpf 计时器
大地缸
博客等级 码龄16年 8粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值