【发布时间】:2014-08-22 21:49:49
【问题描述】:
我是 TPL 世界的新手,我做了那个代码:
var myItems = myWpfDataGrid.SelectedItems;
this.Dispatcher.BeginInvoke(new Action(() =>
{
var scheduler = new LimitedConcurrencyLevelTaskScheduler(5);
TaskFactory factory = new TaskFactory(scheduler);
foreach (MyItem item in myItems)
{
Task myTask = factory.StartNew(() =>
DoLoooongWork(item)
).ContinueWith((t) =>
{
Debug.WriteLine(t.Exception.Message);
if (t.Exception.InnerException != null)
{
Debug.WriteLine(t.Exception.InnerException.Message);
}
},
TaskContinuationOptions.OnlyOnFaulted);
}
}), null);
对 gui 的唯一访问是“var myItems = myWpfDataGrid.SelectedItems;” 它是只读的! “DoLoooongWork()”函数可以访问串口等。它是一个独立的SDK函数,不访问GUI。我知道“Dispatcher.BeginInvoke”有点多余,但我不知道我能做什么,或者我做错了什么。此代码的唯一原因是在“DoLoooongWork()”执行时释放 GUI,但 GUI 被冻结!
那段代码有什么问题?
编辑
感谢@Euphoric 的帮助,我发现了与该帖子类似的问题: COM Interop hang freezes entire COM system. How to cancel COM call
【问题讨论】:
-
您是否尝试在没有工厂的情况下进行操作,例如。只是新的任务和开始?而且没有调度员。类似blog.yojimbocorp.com/2012/05/22/…
-
@Euphoric 是的,我做到了。事实上,我的原始代码没有工厂,也没有调度程序。我在绝望中补充道:)
-
用 Thread.Sleep 替换 DoLoooongWork 时是否会发生冻结?
-
@Euphoric Man,你真是个天才!我用 Thread.Sleep(60) 替换,GUI 是免费的!我很高兴也很伤心...这是对 Interop DLL 的直接调用,它与串行端口等通信...如何冻结 GUI?
-
@ClickOk,也许如果你能展示一下
DoLoooongWork内部到底发生了什么,我们或许可以提供进一步的帮助。这是一个有点类似的问题,仅供参考:stackoverflow.com/q/21211998/1768303。是的,Dispatcher.BeginInvoke在这里是多余的。
标签: wpf debugging user-interface task-parallel-library