Dispatcher从哪里获得控制权?

时间:2016-11-06 08:01:11

标签: c# wpf multithreading user-controls

在用户控件中,除了主线程之外我还有一个线程来处理数据,然后在这样的文本框中显示结果

private delegate void SetTextCallback(string text);
private void SetText(string text)
{
    if (!Dispatcher.CheckAccess())
    {
        Dispatcher.Invoke(new SetTextCallback(SetText), text);
        return;
    }
    txtResult.Text = text;
}

private void ProcessThread()
{
    string result = "";
    // process ...
    SetText(result);
}

在第一次应用程序运行时,此用户控件运行良好。如果我再次关闭并打开它,它就无法正常工作。然后我调试到SetText函数,txtResult.Text显示已经分配了值,但它在UI上是空的。我尝试使用其他控件,如启用按钮,但结果是相同的:在调试中,控件已保持新值但不在UI上。我感觉这个线程得到了封闭用户控制的控制。

有人可以告诉我什么是错的吗?在此先感谢,抱歉英语不好。

更新

我的主题启动:

private Timer _timer;
public MyUserControl()
{
    InitializeComponent();
    _timer = new Timer(ProcessThread);
}

我在哪里调用我的帖子

private void _OnSomeCustomEvent(object sender)
{
    if (sender != null)
    {
        _timer.Change(TimeSpan.FromSeconds(5), TimeSpan.FromMinutes(10));
    }
}

1 个答案:

答案 0 :(得分:0)

移动txtResult.Text = text;内部调度员调用

Dispatcher应该用于从后台线程访问UI控件

这应该有效