【问题标题】:Dispatcher.BeginInvoke in parallel.For is not workingDispatcher.BeginInvoke 并行。For 不工作
【发布时间】:2012-08-07 09:27:10
【问题描述】:

我是 Monodevelop 和 UBUNTU 的新手,现在我正在尝试使用 c# 开发一个桌面应用程序来研究 .Net 并行性。当我使用 Parallel.For 循环时,我遇到了一个问题。据我在网上看到,Dispatcher.beginInvoke 会将工作线程完成的工作委托给 UI 线程。

文章还说,如果您不使用调度程序,它将通过桌面应用程序出错。但它对我来说仍然很好。我不明白这里发生了什么。 (这是我正在使用的链接——http://blogs.msdn.com/b/csharpfaq/archive/2010/06/01/parallel-programming-in-net-framework-4-getting-started.aspx

代码如下:

Parallel.For(2, 20, (i) =>
{
   var result = SumRootN(i);
   this.Dispatcher.BeginInvoke(new Action(() =>
   textBlock1.Text += "root " + i.ToString() + " " +
   result.ToString() + Environment.NewLine)
   , null);
});

如果我取出 "this.Dispatcher.BeginInvoke(new Action(() =>" 语句仍然按预期工作,但根据我上面提到的链接它不应该工作。

详情:

Monodevelop 版本 - monodevelop 2.8.6.3+dfsg-2
Ubuntu 版本 - 12.4

【问题讨论】:

  • Dispatcher 是未在 Mono 中实现的 WPF 框架的一部分。您尝试使用哪种 GUI 框架?可能是 Windows 窗体,然后是您感兴趣的方法:msdn.microsoft.com/en-us/library/…
  • 我不明白你的意思“你想使用什么样的 GUI 框架?”你能详细说明一下吗?

标签: c#-4.0 mono monodevelop


【解决方案1】:

也可能是Parallel.For 只给你一个线程(你有一个单核 CPU 吗?) - 然后它将在创建它的同一线程中运行,并且在没有 Invoke 的情况下不会失败。此外,在某些情况下,您可以从后台线程更新 UI,但不能指望它 - 它可能会在以后中断。

【讨论】:

  • 不,我可以一次运行四个线程。而且我还可以看到,当我执行我的程序时,所有内核都将正常工作,并且比普通的 For 循环快一倍
猜你喜欢
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多