Я новичок в 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);
только один доступ к ГИП «вар myItems = myWpfDataGrid.SelectedItems;» и только для чтения! Функция «DoLoooongWork()» имеет доступ к последовательным портам и т. Д. Это разделенная функция SDK, которая не имеет доступа к графическому интерфейсу. Я знаю, что «Dispatcher.BeginInvoke» немного избыточен, но я не знаю, что я могу сделать, или что я делаю неправильно. Единственная причина для этого кода - освободить GUI, пока выполняется «DoLoooongWork()», но графический интерфейс заморожен!
Что не так с этим кодом?
редактировать
Благодаря @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 Да, я сделал. По правде говоря, мой исходный код без фабрики и без диспетчера. Я добавил в свое отчаяние :) –
Замораживание происходит, когда вы заменяете DoLoooongWork на Thread.Sleep? – Euphoric