为什么使用Dispatcher.CurrentDispatcher.BeginInvoke不更新我的GUI但使用BeginInvoke呢?

时间:2017-10-08 08:03:02

标签: c# multithreading winforms dispatcher

我对 Dispatcher.CurrentDispatcher.BeginInvoke BeginInvoke

之间的差异感到困惑

我有以下部分代码无法正常工作,UpdateCounts方法中的代码被忽略:

private void Start()
{
    _testResults = new TestResults(ModelNameTextBox.Text);
    _timer = new System.Threading.Timer(UpdateCounts, null, 0, 500);            
}

private void UpdateCounts(object info)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(new Action(() =>
    {
        PassCountLabel.Text = _testResults.PassedCount.ToString();
        RequestCountLabel.Text = _testResults.RequestedCount.ToString();                
    }));
}

但是一旦删除Dispatcher.CurrentDispatcher,它就可以正常工作:

private void UpdateCounts(object info)
{
    BeginInvoke(new Action(() =>
    {
        PassCountLabel.Text = _testResults.PassedCount.ToString();
        RequestCountLabel.Text = _testResults.RequestedCount.ToString();                
    }));
}

1 个答案:

答案 0 :(得分:0)

Dispatcher.CurrentDispatcher.BeginInvoke 只有在您从UI线程调用它时才会起作用,否则它会调用当前线程。

您必须使用 Application.Current.Dispatcher 来调用UI线程