[英]Continuation with Tasks (instead of delegates)
我有一個類,其中每個方法異步執行,即返回一個Task,但是每個方法仍應等待上一個調用的完成。
繼續吧?
除了任務繼續采用參數中的委托(動作),而不是其他任務。
我嘗試了不同的方法,而使它能夠正常工作的最佳方法是以下(對我而言相當復雜)的代碼:
private Task QueueTask(Func<Task> futureTask)
{
var completionSource = new TaskCompletionSource<int>();
_lastTask.ContinueWith(async t =>
{
try
{
await futureTask();
completionSource.SetResult(0);
}
catch (Exception ex)
{
completionSource.SetException(ex);
}
});
_lastTask = completionSource.Task;
return _lastTask;
}
_lastTask是我班的私人成員。 由於所有調用都來自UI線程,因此我只保留最后一個任務並繼續執行。
正如我所說,我發現這段代碼非常復雜。 您有更好的建議嗎?
對我來說,似乎您在問錯問題。 這樣的任務隊列是一個不尋常的要求。 我們對您要解決的實際問題一無所知,因此我們無法提出更好的方法。
ContinueWith
用於動態並行處理,因此它不太適合async
代碼。 但是,您可以將ContinueWith
與Unwrap
配對使用,以對await
的行為進行排序(如果忽略了await
與當前上下文的交互方式)。
因此,您可以像這樣簡化任務隊列解決方案:
private Task QueueTask(Func<Task> futureTask)
{
_lastTask = _lastTask.ContinueWith(t => futureTask()).Unwrap();
return _lastTask;
}
但是,可能有更好的解決方案。 如果隊列的目的是提供獨占訪問,則SemaphoreSlim
會更自然。 如果實際上由於某種原因確實需要隊列,請考慮使用數據流網格。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.