c# - C#:BeginInvoke 和 SynchronizationContext 都做同样的事情
问题描述
我是 TPL 的新手,Async/Await。很多事情都不清楚。所以在这里发布一个示例代码。请指导我,不要对我的帖子进行负面标记。
我在这里给出的 BeginInvoke 代码的第一个示例。
private async void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
var count = 0;
await Task.Run(() =>
{
for (var i = 0; i <= 500; i++)
{
count = i;
BeginInvoke((Action)(() =>
{
label1.Text = i.ToString();
}));
Thread.Sleep(100);
}
});
label1.Text = @"Counter " + count;
button1.Enabled = true;
}
我使用 SynchronizationContext 更新 UI 的第二个示例。
private readonly SynchronizationContext synchronizationContext;
private DateTime previousTime = DateTime.Now;
public Form1()
{
InitializeComponent();
synchronizationContext = SynchronizationContext.Current;
}
private async void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
var count = 0;
await Task.Run(() =>
{
for (var i = 0; i <= 5000000; i++)
{
UpdateUI(i);
count = i;
}
});
label1.Text = @"Counter " + count;
button1.Enabled = true;
}
public void UpdateUI(int value)
{
var timeNow = DateTime.Now;
if ((DateTime.Now - previousTime).Milliseconds <= 50) return;
synchronizationContext.Post(new SendOrPostCallback(o =>
{
label1.Text = @"Counter " + (int)o;
}), value);
previousTime = timeNow;
}
请告诉我 BeginInvoke 和 SynchronizationContext 都做同样的事情。哪个更有效。是否存在 BeginInvoke 好的特定场景以及 SynchronizationContext 适合的场景。
解决方案
推荐阅读
- javascript - 剑道网格可以按 JSON 父属性分组吗?
- arrays - 如何在不包括周末和节假日的 Google 表格中自动填充两个给定日期之间的日期
- lua - 我如何解决这个监狱脚本lua
- html - CSS:响应式字体大小在 Safari 浏览器上看起来不响应
- javascript - Javascript 片段有条件地加载
- r - 将第二列向右对齐
- google-cloud-platform - BigQuery 数据传输作业失败
- php - 返回查询空值 DomXPath
- scala - 从 spark UI 获取扫描输入记录大小
- seo - Schema.org - JSON-LD 多个重复的@id 属性