同步上下文SynchronizationContext學習筆記
提供在各種同步模型中傳播同步上下文的基本功能。同步上下文的工作就是確保呼叫在正確的執行緒上執行。
同步上下文的基本操作
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
會啟動一個執行緒來呼叫,不會阻塞當前執行緒。
使用同步上下文來更新UI內容
無論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);
}
相關文章
- 非同步Servlet學習筆記(一)非同步Servlet筆記
- SpringBoot學習筆記(十七:非同步呼叫)Spring Boot筆記非同步
- numpy的學習筆記\pandas學習筆記筆記
- 你不懂js系列學習筆記-非同步與效能- 02JS筆記非同步
- 你不懂js系列學習筆記-非同步與效能- 05JS筆記非同步
- 學習筆記筆記
- Adaptive AUTOSAR 學習筆記 16 - 時間同步和網路管理APT筆記
- 【學習筆記】數學筆記
- 《JAVA學習指南》學習筆記Java筆記
- 機器學習學習筆記機器學習筆記
- 學習筆記-粉筆980筆記
- 學習筆記(3.29)筆記
- 學習筆記(4.1)筆記
- 學習筆記(3.25)筆記
- 學習筆記(3.26)筆記
- JavaWeb 學習筆記JavaWeb筆記
- golang 學習筆記Golang筆記
- Nginx 學習筆記Nginx筆記
- spring學習筆記Spring筆記
- gPRC學習筆記筆記
- GDB學習筆記筆記
- 學習筆記(4.2)筆記
- 學習筆記(4.3)筆記
- 學習筆記(4.4)筆記
- Servlet學習筆記Servlet筆記
- 學習筆記(3.27)筆記
- jest 學習筆記筆記
- NodeJS學習筆記NodeJS筆記
- WebSocket 學習筆記Web筆記
- mount 學習筆記筆記
- mapGetters學習筆記筆記
- jQuery學習筆記jQuery筆記
- 學習筆記:DDPG筆記
- flex學習筆記Flex筆記
- react 學習筆記React筆記
- Promise學習筆記Promise筆記
- vim學習筆記筆記
- Ansible 學習筆記筆記