【问题标题】:Where does Dispatcher get control from?Dispatcher 从哪里获得控制权?
【发布时间】:2016-11-06 08:01:11
【问题描述】:

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

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));
    }
}

【问题讨论】:

  • 听起来你在问 SetText() 从哪里得到 txtResult?
  • 是的,我想是的。你能帮我吗?
  • 根据我在MSDN 中找到的内容“在构造时,DispatcherObject 存储对链接到当前正在运行的线程的 Dispatcher 的引用。” 这是否意味着每个线程创建调度程序的一个实例?
  • 它是从代码中的某个地方获取的。你能分享那部分吗?听起来就像您第二次运行代码时一样,它对您第一次运行代码时遗留的 UI 有一个过时的引用。但是我不能在没有看到代码的情况下说出如何或为什么。
  • @user1728585 我只需要看到足够多的东西来重新创建问题。我不需要你的图书馆和数据库。但正如我所说,这是我最后一次尝试。

标签: c# wpf multithreading user-controls


【解决方案1】:

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

应使用调度程序从后台线程访问 UI 控件

这应该可以工作

【讨论】:

  • 你的意思是这样的:Dispatcher.Invoke(new Action(() => { txtResult.Text = text; }));?
猜你喜欢
  • 2014-11-02
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多