最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# SynchronizationContext以及Send和Post使用解讀

 更新時(shí)間:2023年05月04日 10:25:34   作者:你の貓  
這篇文章主要介紹了C# SynchronizationContext以及Send和Post使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

C# SynchronizationContext及Send和Post使用

1、(SynchronizationContext)同步上下文的作用

SynchronizationContext其實(shí)就是實(shí)現(xiàn)線程之間通訊的。

2、創(chuàng)建(SynchronizationContext)同步上下文的方法

  • 1)直接new創(chuàng)建一個(gè)SynchronizationContext同步上下文對(duì)象。
  • 2)winform程序通過SynchronizationContext.Current獲取UI線程的同步上下文對(duì)象。
  • 3)AsyncOperation和AsyncOperationManager類來操作同步上下文對(duì)象,不直接訪問同步上下文對(duì)象(SynchronizationContext),推薦這程方法。

3、(SynchronizationContext)同步上下文的Send和Post方法

看了一些解釋Send和Post方法,感覺弄得很復(fù)雜,我感覺其實(shí)簡(jiǎn)單來說,

  • 1)Send方法就是同步調(diào)用,在當(dāng)前線程上調(diào)用委托。
  • 2)Post方法就是異步調(diào)用,在線程池中的線程調(diào)用委托。

4、示例代碼

1)(SynchronizationContext)同步上下文使用示例代碼

using System;
using System.Threading;
namespace SynchronizationContextExample
{
? ? public class MySynchronizedClass
? ? {
? ? ? ? private Thread workerThread;
? ? ? ? private SynchronizationContext context;
? ? ? ? public event EventHandler SomethingHappened;
? ? ? ? public MySynchronizedClass()
? ? ? ? {
? ? ? ? ?//獲取當(dāng)前SynchronizationContext非常重要對(duì)象在構(gòu)造函數(shù)中。我們想要的
? ? ? ? ?//屬于線程的SynchronizationContext對(duì)象
? ? ? ? ?//這個(gè)對(duì)象正在被創(chuàng)建。
? ? ? ? ?//context= SynchronizationContext.Current;當(dāng)前線程可能沒有SynchronizationContext對(duì)象;該線程尚未為設(shè)置SynchronizationContext對(duì)象。
? ? ? ? ?//如果是這樣,我們可以通過創(chuàng)建SynchronizationContext來簡(jiǎn)化
? ? ? ? ? ? if(context == null)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? context = new SynchronizationContext();
? ? ? ? ? ? }
? ? ? ? ? ? workerThread = new Thread(new ThreadStart(DoWork));
? ? ? ? ? ? workerThread.Start();
? ? ? ? }
? ? ? ? private void DoWork()
? ? ? ? {
? ? ? ? ? ? context.Post(new SendOrPostCallback(delegate(object state)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? EventHandler handler = SomethingHappened;
? ? ? ? ? ? ? ? if(handler != null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? handler(this, EventArgs.Empty);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }), null);
? ? ? ? }
? ? }
}

2)使用AsyncOperation和AsyncOperationManager類示例代碼

using System;
using System.Threading;
using System.ComponentModel;
namespace SynchronizationContextExample
{
? ? public class MySynchronizedClass
? ? {
? ? ? ? private Thread workerThread;
? ? ? ? private AsyncOperation operation;
? ? ? ? public event EventHandler SomethingHappened;
? ? ? ? public MySynchronizedClass()
? ? ? ? {
? ? ? ? ? ? operation = AsyncOperationManager.CreateOperation(null);
? ? ? ? ? ? workerThread = new Thread(new ThreadStart(DoWork));
? ? ? ? ? ? workerThread.Start();
? ? ? ? }
? ? ? ? private void DoWork()
? ? ? ? {
? ? ? ? ? ? operation.Post(new SendOrPostCallback(delegate(object state)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? EventHandler handler = SomethingHappened;
? ? ? ? ? ? ? ? if(handler != null)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? handler(this, EventArgs.Empty);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }), null);
? ? ? ? ? ? operation.OperationCompleted();
? ? ? ? }
? ? }
}

C#同步上下文SynchronizationContext學(xué)習(xí)筆記

提供在各種同步模型中傳播同步上下文的基本功能。同步上下文的工作就是確保調(diào)用在正確的線程上執(zhí)行。

同步上下文的基本操作

Current 獲取當(dāng)前同步上下文

var context = SynchronizationContext.Current;

Send 一個(gè)同步消息調(diào)度到一個(gè)同步上下文。

SendOrPostCallback callback = o =>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//TODO:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?};
context.Send(callback,null);
  • send調(diào)用后會(huì)阻塞直到調(diào)用完成。 
  • Post 將異步消息調(diào)度到一個(gè)同步上下文。
SendOrPostCallback callback = o =>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //TODO:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };
context.Post(callback,null);

和send的調(diào)用方法一樣,不過Post會(huì)啟動(dòng)一個(gè)線程來調(diào)用,不會(huì)阻塞當(dāng)前線程。

使用同步上下文來更新UI內(nèi)容

無(wú)論WinFroms和WPF都只能用UI線程來更新界面的內(nèi)容

常用的調(diào)用UI更新方法是Inovke(WinFroms):

private void button_Click(object sender, EventArgs e)
{
? ? ? ?ThreadPool.QueueUserWorkItem(BackgroudRun);
}
private void BackgroudRun2(object state)
{
? ? ? ? ? ? this.Invoke(new Action(() =>
? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ?   label1.Text = "Hello Invoke";
? ? ? ? ? ? ? ? ? ? ? ?}));
}

使用同步上下文也可以實(shí)現(xiàn)相同的效果,WinFroms和WPF繼承了SynchronizationContext,使同步上下文能夠在UI線程或者Dispatcher線程上正確執(zhí)行

System.Windows.Forms. WindowsFormsSynchronizationContext
System.Windows.Threading. DispatcherSynchronizationContext

調(diào)用方法如下:

private void button_Click(object sender, EventArgs e)
{
? ? ? ? ? ?var context = SynchronizationContext.Current; //獲取同步上下文
? ? ? ? ? ?Debug.Assert(context != null);
? ? ? ? ? ?ThreadPool.QueueUserWorkItem(BackgroudRun, context);?
}
private void BackgroudRun(object state)
{
? ? var context = state as SynchronizationContext; //傳入的同步上下文
? ? Debug.Assert(context != null);
? ? SendOrPostCallback callback = o =>
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? label1.Text = "Hello SynchronizationContext";
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? };
? ? context.Send(callback,null); //調(diào)用
}

使用.net4.0的Task 可以簡(jiǎn)化成

private void button_Click(object sender, EventArgs e)
{
? ? ? ? ? ? var ?scheduler = TaskScheduler.FromCurrentSynchronizationContext(); // 創(chuàng)建一個(gè)SynchronizationContext 關(guān)聯(lián)的 TaskScheduler
? ? ? ? ? ? Task.Factory.StartNew(() => label1.Text = "Hello TaskScheduler", CancellationToken.None,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TaskCreationOptions.None, scheduler);
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • c#讀取xml文件到datagridview實(shí)例

    c#讀取xml文件到datagridview實(shí)例

    c#讀取xml文件到datagridview實(shí)例,需要的朋友可以參考一下
    2013-03-03
  • WPF+WriteableBitmap實(shí)現(xiàn)高性能曲線圖的繪制

    WPF+WriteableBitmap實(shí)現(xiàn)高性能曲線圖的繪制

    這篇文章主要為大家詳細(xì)介紹了如何利用WPF+WriteableBitmap實(shí)現(xiàn)高性能曲線圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下
    2022-08-08
  • .NET/C# 使用Stopwatch測(cè)量運(yùn)行時(shí)間

    .NET/C# 使用Stopwatch測(cè)量運(yùn)行時(shí)間

    這篇文章主要介紹了.NET/C# 使用Stopwatch測(cè)量運(yùn)行時(shí)間,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • OpenCvSharp圖像的修改和保存以及掩膜操作

    OpenCvSharp圖像的修改和保存以及掩膜操作

    這篇文章主要介紹了OpenCvSharp圖像的修改和保存以及掩膜操作,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 在C#中如何使用正式表達(dá)式獲取匹配所需數(shù)據(jù)

    在C#中如何使用正式表達(dá)式獲取匹配所需數(shù)據(jù)

    本文給大家分享C#中如何使用正式表達(dá)式獲取匹配所需數(shù)據(jù) ,非常實(shí)用,對(duì)正則表達(dá)式獲取匹配相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧
    2016-03-03
  • C#編程實(shí)現(xiàn)取整和取余的方法

    C#編程實(shí)現(xiàn)取整和取余的方法

    這篇文章主要介紹了C#編程實(shí)現(xiàn)取整和取余的方法,結(jié)合實(shí)例形式分析了C#中Math.Celling與Math.Floor函數(shù)的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • 詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息

    詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息

    這篇文章主要介紹了詳解如何獲取C#類中發(fā)生數(shù)據(jù)變化的屬性信息,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • C#實(shí)現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中

    C#實(shí)現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中

    這篇文章主要介紹了C#實(shí)現(xiàn)把txt文本數(shù)據(jù)快速讀取到excel中,本文直接給出示例代碼,需要的朋友可以參考下
    2015-06-06
  • Unity UGUI教程之實(shí)現(xiàn)滑頁(yè)效果

    Unity UGUI教程之實(shí)現(xiàn)滑頁(yè)效果

    使用UGUI提供的ScrollRect和ScrollBar組件實(shí)現(xiàn)基本滑動(dòng)以及自己控制每次移動(dòng)一頁(yè)來達(dá)到滑頁(yè)的效果。具體實(shí)現(xiàn)思路請(qǐng)參考下本教程
    2016-04-04
  • Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽(附demo)

    Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽(附demo)

    這篇文章主要介紹了Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評(píng)論

云林县| 乌苏市| 荔浦县| 文成县| 桦南县| 双辽市| 南昌市| 鲁山县| 天镇县| 山东省| 鄄城县| 锦屏县| 卢龙县| 安新县| 西乌珠穆沁旗| 雅江县| 内丘县| 德兴市| 梁平县| 德庆县| 镇江市| 赣州市| 敖汉旗| 微博| 西昌市| 潍坊市| 伊金霍洛旗| 伊川县| 京山县| 石渠县| 东辽县| 江北区| 宜宾市| 铁岭市| 岑溪市| 贡山| 夏邑县| 乾安县| 山东省| 云安县| 松溪县|