簡體   English   中英

使用 C# 異步任務和 arguments 作為 function 參數

[英]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> ActiveQueuesList<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM