我有一個串列Action,我想使用async/await,但我不知道如何將以下代碼(簡化示例)轉換為使用 af 串列Task?重要的是,我需要以某種方式獲取每個任務中的操作名稱,并確保任務在繼續執行下一個ForEach回圈之前完成。我的代碼Main在Program.
注意:使用 3 個引數呼叫操作,因此我需要使用相同的引數類似地“呼叫”任務。
new List<Action<string, string, string>>()
{
Action1,
Action2,
Action3,
Action4,
Action5
// etc...
}.ForEach(action => {
Console.WriteLine("Invoking action: " action.Method.Name " ...");
action.Invoke("Hello", "World", "!");
// do other stuff...
});
先感謝您!
uj5u.com熱心網友回復:
這是一個按順序運行作業的版本:
public static async Task Main()
{
// Action<string,string,string> becomes
// Func<string,string,string, Task> because the worker methods
// return a Task, not void
var work = new List<Func<string, string, string, Task>>()
{
X,
X2,
};
foreach(var t in work)
{
Console.WriteLine("Invoking action: " t.Method.Name " ...");
await t("Hello", "World", "!").ConfigureAwait(false);
};
}
測驗
和
static async Task X(string a, string b, string c)
{
await Task.Delay(TimeSpan.FromMilliseconds(1)).ConfigureAwait(false);
Console.WriteLine($"{a} {b} {c}");
}
static async Task X2(string a, string b, string c)
{
await Task.Delay(TimeSpan.FromMilliseconds(1)).ConfigureAwait(false);
Console.WriteLine($"{c} {b} {a}");
}
這列印
Invoking action: X ...
Hello World !
Invoking action: X2 ...
! World Hello
uj5u.com熱心網友回復:
您嘗試做的一個基本示例是:
var actions = new List<Action<string, string, string>>();
//....
var funcs = actions.Select(x => new Func<string, string, string, Task>((one, two, three) =>
{
x(one, two, three);
return Task.CompletedTask;
}));
var tasks = new List<Task>();
foreach(var func in funcs)
{
tasks.Add(func("one", "two", "three")); //wherever these parameters come from
}
await Task.WhenAll(tasks);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494478.html
