将Progress对象与自定义事件结合起来并且不确定它为什么会起作用但是确实如此

时间:2016-04-01 08:04:29

标签: c# c#-4.0 win-universal-app

我想弄清楚为什么会有效。我创建了一个自定义事件和一个从无UI线程触发的进度对象。我将结果事件放在我的自定义事件中,并且我的UI的交叉线程更新仍然有效。这毫无意义。该事件触发并运行其代码,progress事件如何在另一事件中触发。我知道永远不应该这样做。但我无法从逻辑上弄清楚它为什么会起作用。

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        pracViewModel myViewModel = new pracViewModel(5, "Hello");

        Progress<int> progress = new Progress<int>();

        myViewModel.triggerEvent += (i) =>
        {
            Debug.WriteLine(i.ToString());

            progress.ProgressChanged += (o, result) =>
            {
                txtBlock1.Text = result.ToString();

            };

        };


        myViewModel.countAsync(progress);
    }




class pracViewModel
{
    public async void countAsync(Progress<int> progress)
    {
        await count(progress);
    }

    private Task count(IProgress<int> progress)
    {
        return Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                Task.Delay(1000).Wait();
                progress.Report(i);
                triggerEvent(i);
            }
        });
    }

}

1 个答案:

答案 0 :(得分:2)

Progress<T>构造函数捕获当前的SynchronizationContext - 在本例中为UI上下文。

当线程池线程调用Report时,Progress<T>将使用该UI上下文,因此UI线程将引发Progress<T>.ProgressChanged