首页 > 解决方案 > 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 适合的场景。

标签: c#

解决方案


推荐阅读