所有的,我有一個情況,我被要求多線程一個大的'成本搗毀'算法。我是比較有經驗與Task
S和將在採用類似Aysnc/Await VS.任務/繼續UI控制訪問
CancellationTokenSource cancelSource = new CancellationTokenSource();
CancellationToken token = cancelSource.Token;
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task<bool> asyncTask = null;
asyncTask = Task.Factory.StartNew<bool>(() =>
SomeMethodAsync(uiScheduler, token, _dynamic), token);
asyncTask.ContinueWith(task =>
{
// For call back, exception handling etc.
}, uiScheduler);
和模式有信心然後,我需要提供和用戶界面操作的任何操作,我會用
Task task = Task.Factory.StartNew(() =>
{
mainForm.progressLeftLabelText = _strProgressLabel;
}, CancellationToken.None,
TaskCreationOptions.None,
uiScheduler);
情況可能被包裹在一個方法中。
現在,我意識到我可以使這一切都變得更加複雜,並利用.NET 4.5的關鍵字async/await
。不過,我有一些問題:如果我有一個地方CostEngine.ProgressInfo
是被定義爲
public async Task ProcessScriptAsync(SSGForm doc, IProgress<ProgressInfo> progressInfo,
CancellationToken token, bool bShowCompleted = true)
{
...
if (!await Task<bool>.Run(() => TheLongRunningProcess(doc)))
return
...
}
用於返回進度信息和方法
ProcessScriptAsync
一些基礎類的長時間運行的方法,我推出使用
// Start processing asynchroniously.
IProgress<CostEngine.ProgressInfo> progressIndicator =
new Progress<CostEngine.ProgressInfo>();
cancelSource = new CancellationTokenSource();
CancellationToken token = cancelSource.Token;
CostEngine.ScriptProcessor script = new CostEngine.ScriptProcessor(this);
await script.ProcessScriptAsync(doc, progressIndicator, token);
我有兩個問題:
要得到
ProcessScriptAsync
立即返回控制到UI 幾乎我立即等待一個新的Task<bool>
代表(這似乎避免了連續的async
/await
s)。 這是否是撥打ProcessScriptAsync
的正確方法? [「懶惰初始化」,通過在外包裹方法?]要從
TheLongRunningProcess
內訪問UI,我僅僅通過在UITaskScheduler
uiScheduler
;即TheLongRunningProcess(doc, uiScheduler)
,然後使用:
Task task = Task.Factory.StartNew(() =>
{
mainForm.progressLeftLabelText = _strProgressLabel;
}, CancellationToken.None,
TaskCreationOptions.None,
uiScheduler);
如前?
對不起,感謝您的時間。
既然你有兩個問題,他們真的應該問兩個不同的問題,而不是一個。 – Servy
但這意味着複製大部分問題。我總是認爲/擔心這一點,但當問題如此嚴重相關時,複製超出界限的東西似乎有點矯枉過正...... – MoonKnight
呃。這其中大部分並不適用於第二個問題,也不需要在那裏。它也允許你得到一個問題的答案,而不是另一個問題,如果有人知道只有一個答案。如果你問這兩個問題,你只會將答案限制在知道兩者答案的人身上。 – Servy