您好,登錄后才能下訂單哦!
今天小編給大家分享一下C# SynchronizationContext、Send和Post怎么使用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
1、(SynchronizationContext)同步上下文的作用
SynchronizationContext其實就是實現線程之間通訊的。
2、創建(SynchronizationContext)同步上下文的方法
1)直接new創建一個SynchronizationContext同步上下文對象。
2)winform程序通過SynchronizationContext.Current獲取UI線程的同步上下文對象。
3)AsyncOperation和AsyncOperationManager類來操作同步上下文對象,不直接訪問同步上下文對象(SynchronizationContext),推薦這程方法。
3、(SynchronizationContext)同步上下文的Send和Post方法
看了一些解釋Send和Post方法,感覺弄得很復雜,我感覺其實簡單來說,
1)Send方法就是同步調用,在當前線程上調用委托。
2)Post方法就是異步調用,在線程池中的線程調用委托。
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() { //獲取當前SynchronizationContext非常重要對象在構造函數中。我們想要的 //屬于線程的SynchronizationContext對象 //這個對象正在被創建。 //context= SynchronizationContext.Current;當前線程可能沒有SynchronizationContext對象;該線程尚未為設置SynchronizationContext對象。 //如果是這樣,我們可以通過創建SynchronizationContext來簡化 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(); } } }
提供在各種同步模型中傳播同步上下文的基本功能。同步上下文的工作就是確保調用在正確的線程上執行。
Current 獲取當前同步上下文
var context = SynchronizationContext.Current;
Send 一個同步消息調度到一個同步上下文。
SendOrPostCallback callback = o => { //TODO: }; context.Send(callback,null);
send調用后會阻塞直到調用完成。
Post 將異步消息調度到一個同步上下文。
SendOrPostCallback callback = o => { //TODO: }; context.Post(callback,null);
和send的調用方法一樣,不過Post會啟動一個線程來調用,不會阻塞當前線程。
無論WinFroms和WPF都只能用UI線程來更新界面的內容
常用的調用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"; })); }
使用同步上下文也可以實現相同的效果,WinFroms和WPF繼承了SynchronizationContext,使同步上下文能夠在UI線程或者Dispatcher線程上正確執行
System.Windows.Forms. WindowsFormsSynchronizationContext System.Windows.Threading. DispatcherSynchronizationContext
調用方法如下:
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); //調用 }
使用.net4.0的Task 可以簡化成
private void button_Click(object sender, EventArgs e) { var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); // 創建一個SynchronizationContext 關聯的 TaskScheduler Task.Factory.StartNew(() => label1.Text = "Hello TaskScheduler", CancellationToken.None, TaskCreationOptions.None, scheduler); }
以上就是“C# SynchronizationContext、Send和Post怎么使用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。