我在TPL世界是新的,而我做了代码:为什么我的GUI冻结?
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
您是否尝试过在没有工厂的情况下做例如。只是新的任务和开始?没有调度员。像http://blog.yojimbocorp.com/2012/05/22/using-task-for-responsive-ui-in-wpf/ – Euphoric
@Euphoric是的,我做了。事实上,我的原始代码没有工厂,也没有调度程序。我加入了我的绝望:) –
当你用Thread.Sleep替换DoLoooongWork时,冻结是否会发生? – Euphoric