【问题标题】:wpf begininvoke for updating uiwpf begininvoke 用于更新 ui
【发布时间】:2017-04-12 08:19:32
【问题描述】:

您好,我正在使用 c# wpf。现在问题是线程。我无法访问 UI 元素的其他线程,并且当我使用 Dispatcher.BeginInvoke 时,我无法控制 Window。计算大约需要 5 分钟。我想将计算状态更新到 UI 进度条并自己移动窗口。谁能帮我。 :)

public delegate void TrainDelegate();

private void btnTrain_Click(object sender, RoutedEventArgs e)
{
    Dispatcher.BeginInvoke(DispatcherPriority.Background, new TrainDelegate(StartTrain));
}

StartTrain 函数中我调用了文本框。
喜欢关注

Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(txtbTrainPath.Text);

它可以工作,但会阻止主窗口。他们说Begininvoke 是非阻塞调用。
请你帮助我好吗?这里应该改变什么?

【问题讨论】:

  • 代码太少,无法分析哪里出错了。你可以多加一些。比如你如何在线程上执行计算等等。
  • 我使用了最简单的调度方法
  • 最好从 Dispatcher.Invoke 获取文本框内容(如果需要),然后以文本作为参数启动线程
  • 主要问题是主窗口被阻塞。我想在运行这个长计算线程时移动主窗口。

标签: c# wpf multithreading user-interface


【解决方案1】:

好的,那么

private void btnTrain_Click(object sender, RoutedEventArgs e)
{
    string myText = txtbTrainPath.Text;
    Task.Factory.StartNew( () => { StartTrain(myText); } );
}

【讨论】:

  • 跨度>
  • 这是我的进度条我要实时更新这个进度条状态
  • 在您的委托调用 Dispatcher.BeginInvoke( () => { prgbState.Value =+++ });
  • 如果我使用 Dispatcher.BeginInvoke 它将再次阻塞主窗口。我说的对吗?
  • 现在我在您的代码上方使用了它,因此它不会阻塞主窗口。那个 BeginInvoke 函数说我是非阻塞的。但现在它真的阻塞了我的主窗口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多