Я хочу сделать result
(возвращаемый результат тяжелого процесса) доступным после выполнения Heavy Process
в дополнительном потоке, поскольку в основном ожидается, что во время процесса пользовательский интерфейс не будет работать, После процесс осуществляется может играть с result
возвращение результата из дополнительной темы
во время некоторых поисков, и, глядя на мои статьи, я получил, что есть несколько подходов к , чтобы это произошло, пожалуйста, обеспечить наилучший подход вы знали или использовать в подобной ситуации
это образец, который я хочу иметь дело с наилучшим подходом:
public ACollection DoProcess(Document docProcess)
{
ACollection result = new ACollection();
ThreadStart threadStart = delegate
{
result = MyProcess(docProcess);
};
var threadProcess = new Thread(threadStart);
threadProcess.Start();
return result ;
}
Другие возможные подходы могут быть IAsyncResult, BackgroundWorker, использование таймеров и проверки состояния, вместо возвращения результата в способ справиться с этим и сообщить об этом в пользовательском интерфейсе отправить его непосредственно в поточно-образом для наших элементов управления пользовательского интерфейса ...
Пожалуйста, дайте свое собственное мнение и образец в подобном случае, заранее спасибо
Edit 3: подход - на основе Ответ Брайана
LenzCollection myResultCollection = new LenzCollection();
TaskScheduler ui = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
myResultCollection = DoCollect(docProcess);
//Task.WaitAll();
return myResultCollection;
}).ContinueWith((task =>
{
myResultCollection = task.Result;
}), ui);
return myResultCollection;
Он по-прежнему не ждать и не даст желаемого результата
'while (threadProcess.IsAlive) {}' делает эту однопоточную. И CPU-hog. –
Я получил несколько минут спустя и отредактировал, спасибо, но все же должен знать ваш предлагаемый многоразовый подход, thx – LastBye
BackgroundWorker уже получил всю функциональность, о которой вы просили. Так зачем пытаться изобрести колесо? – Zarat