[英]Use C# async task with arguments as a function parameter
我正在構建自己的基於隊列的系統,但到目前為止我有一個小問題:如何將異步任務添加到另一個 function 來處理它?
我的處理器 function 的工作原理是這樣的:
我有一個隊列 object:
public class Queue { public string Id; public CancellationTokenSource Cts; public Task Task; public Queue(Task task, string id, CancellationTokenSource cts) { Id = id; Cts = cts; Task = task; }}
以及將我的任務添加到 2 個列表的命令: List<Queue> ActiveQueues
和List<Queue> Queued
ActiveQueues 是一個包含所有活動隊列的列表,而 Queued 是一個包含所有隊列的列表。
我的添加 function 看起來像這樣:
public async Task Add(Task task, string id, CancellationTokenSource cts)
{
var queue = new Queue(task, id, cts);
if (ActiveQueues.Count < MainWindow.appConfig.MaxAsyncSessions)
{
var exists = ActiveQueues.Find(q => q.Id == queue.Id);
if (exists == null) // I don't want 2 queues with the same id to run at once so I add it to the queued list that's processed by another function.
{
ActiveQueues.Add(queue);
ActiveQueueIds.Add(queue.Id);
await queue.Task;
}
else
{
Queued.Add(queue);
}
}
else
{
Queued.Add(queue);
}
}
問題是我的任務也有參數,所以使用它像queue.Add(AsyncFunction(param1, param2), "idExample", new CancellationTokenSource())
在將它添加到 ActiveQueues 列表之前觸發 function 。
做我現在想做的事情的正確方法是什么?
更改您的Add
方法簽名以接受委托:
public async Task Add(Func<Task> taskFactory, string id, CancellationTokenSource cts)
並且要么相應地更改Queue
ctor 並引入像Start
這樣的方法,它將啟動任務(基本上調用taskFactory()
),如果它已經啟動並緩存taskFactory()
的結果,則可選擇進行驗證,或者使用Lasy<>
來處理它。
使用Lazy
的簡單實現如下所示(為簡潔起見,省略了一些代碼):
class Queue
{
public Lazy<Task> Task;
public Queue(Func<Task> taskFactory)
{
Task = new Lazy<Task>(taskFactory);
}
}
// in your Add method:
var queue = new Queue(taskFactory);
await queue.Task.Value;
// Add call:
q.Add(() => AsyncFunction(param1, param2), "idExample", new CancellationTokenSource())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.