C#:BeginInvoke和SynchronizationContext都做相同的事情

时间:2018-12-23 09:13:30

标签: c#

我是TPL的新手,异步/等待。这么多事情还不清楚。因此请在此处发布示例代码。请为我提供指导,不要给我的帖子加上负面的标记。

我在这里给出的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会很好。

0 个答案:

没有答案