日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

.NET : 再谈谈多线程

發布時間:2025/5/22 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET : 再谈谈多线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這幾天在講.NET核心編程時再次探討到了多線程這一部分。其中,我們討論到如果使用BackgroundWorker這個組件的話,那么它的幾個事件到底是運行在幾個線程的。下面是一個例子

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Threading;

namespace ConsoleApplication1
{
??? class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? BackgroundWorker worker = new BackgroundWorker();
??????????? worker.DoWork += new DoWorkEventHandler(worker_DoWork);
??????????? worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
??????????? worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
??????????? worker.WorkerReportsProgress = true;

??????????? Console.WriteLine("主方法運行的線程:{0}", Thread.CurrentThread.ManagedThreadId);

??????????? worker.RunWorkerAsync();

??????????? Console.Read();
??????? }

??????? static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
??????? {
??????????? Console.WriteLine("進度更新方法運行的線程:{0}", Thread.CurrentThread.ManagedThreadId);

??????? }

??????? static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
??????? {
??????????? Console.WriteLine("異步方法完成,運行的線程:{0}", Thread.CurrentThread.ManagedThreadId);
??????? }

??????? static void worker_DoWork(object sender, DoWorkEventArgs e)
??????? {
??????????? Console.WriteLine("執行異步方法,線程:{0}", Thread.CurrentThread.ManagedThreadId);
??????????? BackgroundWorker worker = (BackgroundWorker)sender;
??????????? worker.ReportProgress(10);
??????? }
??? }
}

?

答案是:有時候是這樣

?

有時候又這樣(我在Do_Work事件里面加了一個Sleep之后的效果)

這的確有點讓人捉摸不透。這意味著什么呢?我想,這意味著,只有一點是可以確認的:主方法運行在一個線程,而要后臺操作的方法運行在另外一個線程,至于這個后臺方法的進度匯報或者完成事件,則可能與后臺方法在一個線程,也可能不在一個線程。這估計是取決于后臺方法本身所消耗的時間,以及運行環境的線程利用情況而定。

以上行為在Windows Forms的原理卻不是一樣的

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication1
{
??? public partial class Form1 : Form
??? {
??????? public Form1()
??????? {
??????????? InitializeComponent();

??????????? BackgroundWorker worker = new BackgroundWorker();
??????????? worker.DoWork += new DoWorkEventHandler(worker_DoWork);
??????????? worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
??????????? worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
??????????? worker.WorkerReportsProgress = true;

??????????? Console.WriteLine("主方法運行的線程:{0}", Thread.CurrentThread.ManagedThreadId);

??????????? worker.RunWorkerAsync();

??????? }

??????? static void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
??????? {
??????????? Console.WriteLine("進度更新方法運行的線程:{0}", Thread.CurrentThread.ManagedThreadId);

??????? }

??????? static void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
??????? {
??????????? Console.WriteLine("異步方法完成,運行的線程:{0}", Thread.CurrentThread.ManagedThreadId);
??????? }

??????? static void worker_DoWork(object sender, DoWorkEventArgs e)
??????? {
??????????? Console.WriteLine("執行異步方法,線程:{0}", Thread.CurrentThread.ManagedThreadId);
??????????? Thread.Sleep(5000);
??????????? BackgroundWorker worker = (BackgroundWorker)sender;
??????????? worker.ReportProgress(10);
??????? }
??? }
}

主方法運行的線程:8
執行異步方法,線程:9
進度更新方法運行的線程:8
異步方法完成,運行的線程:8

這是顯然有必要的,因為異步方法進度更新或者完成的話,通常我們都需要更新窗體的元素(例如控件),如果此時的線程不是一樣的話,就會導致線程安全問題。

?

最后,總結一下BackgroundWorker這個組件的工作原理

RunWorkerAsync方法==》觸發DoWork事件==》執行DoWork方法(運行在一個獨立的線程)==》可以通過調用ReportProgress匯報進度==》觸發ProgressChanged事件==》執行ProgressChanged方法==》如果DoWork方法完成了所有操作,則觸發RunWorkerCompleted事件==》執行RunWorkerCompleted方法

本文由作者:陳希章 于 2009/7/21 5:55:22 發布在:http://www.cnblogs.com/chenxizhang/
本文版權歸作者所有,可以轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
更多博客文章,以及作者對于博客引用方面的完整聲明以及合作方面的政策,請參考以下站點:陳希章的博客中心

轉載于:https://www.cnblogs.com/chenxizhang/archive/2009/07/21/1527440.html

總結

以上是生活随笔為你收集整理的.NET : 再谈谈多线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美一级片在线播放 | 91精品国产91综合久久蜜臀 | 国产一卡二 | 色哟哟一区二区三区四区 | 国产精久久一区二区三区 | 国语精品久久 | 久久精品小视频 | 久久久久久久国产精品视频 | 国产伦精品一区二区 | 国产夜色精品一区二区av | www夜插内射视频网站 | 3d动漫精品啪啪一区二区免费 | 九色在线视频 | 狼人综合网 | 超碰成人免费电影 | 国产重口老太伦 | 日韩国产一级 | 青青草黄色 | 草草影院一区二区三区 | 日日天天 | 激情黄色小说网站 | 香蕉视频三级 | 九九精品国产 | 成人黄色免费网址 | 无遮挡国产 | 亚洲区中文字幕 | 狠狠躁夜夜躁人人爽视频 | 午夜色影院 | 日本女人性视频 | 天堂av8| 国产又爽又黄的激情精品视频 | 五月婷婷国产 | 久久久久香蕉 | 亚洲香蕉中文网 | 人妻av一区二区 | 黄色在线观看免费视频 | 97se亚洲国产综合在线 | 浪潮av网站 | 久久99精品久久只有精品 | 高清成人 | 折磨小男生性器羞耻的故事 | 日本三级中国三级99人妇网站 | 一区二区三区激情 | 丝袜一区二区三区 | 久久精品久久久久久久 | 亚州色图欧美色图| 制服.丝袜.亚洲.另类.中文 | 吃瓜网今日吃瓜 热门大瓜 色婷在线 | 中文字幕在线观看第二页 | 熟女人妻在线视频 | 91av精品| 亚州国产 | 国产96在线 | 亚洲 | 久久久精品99 | 午夜小福利 | 国产伦精品一区 | 中文在线字幕观看 | 99在线视频免费观看 | 国产美女在线免费观看 | 99九九久久 | 99久久99久久精品国产片桃花 | 大香伊人| 日本中文字幕高清 | 国产精品人人妻人人爽人人牛 | 自拍视频网址 | 国产精品九九九 | 亚洲中文字幕一区 | 理论片一级| 久一在线视频 | 欧美不卡在线视频 | 姑娘第5集在线观看免费好剧 | 少妇三级全黄 | 日韩综合精品 | 色就是色网站 | 天天射综合 | 午夜精品三级久久久有码 | 欧美成人做爰大片免费看黄石 | 久久精品黄 | 91射射| 国产经典av | 日韩av一区二区三区在线观看 | 亚洲一区二区视频在线播放 | 国产另类ts人妖一区二区 | av网站免费大全 | 欧美一性一乱一交一视频 | 日本不卡一区二区 | 亚洲一级免费毛片 | 国产69精品久久久久久 | 少妇人妻偷人精品视频蜜桃 | 精品久久一区二区三区 | 欧美国产成人精品一区二区三区 | 69国产精品 | 午夜精产品一区二区在线观看的 | 久草视频免费在线 | 国产美女视频一区 | 免费成人深夜小野草 | 日韩成人免费在线观看 | 一级黄色特级片 | 亚洲av久久久噜噜噜熟女软件 |