Thy*_*ari 0 .net c# architecture
我希望我能在第一次尝试时就得到正确的解释:
我有一个Dictionary<int, Action> MyActions。我有一个看起来像这样的方法:
int actionNumber = 0;
while (isRunning) {
if (Phases.TryGetValue(actionNumber, out var action))
{
action.Invoke();
}
actionNumber++;
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,只要前面的方法完成,这些方法就会依次运行。当出现错误时,我保存了 actionNumber,这样我就可以返回到正确的最后一个方法并从那里继续。
我放入字典中的方法最初只是简单的 void 方法。现在我发现自己还必须将异步方法放在那里,因为其中一些方法体内有等待。这意味着字典必须在其中保留 void 方法和异步任务方法。while 循环必须有一个等待,否则当它运行异步任务方法时它将继续。
我的解决方案:
解决方案A:
将字典设为a Dictionary<int, Task> MyActions,并将所有内容设为任务,即使它是一个简单的void 方法。将 while 循环更改为:
int actionNumber = 0;
while (isRunning) {
if (Phases.TryGetValue(actionNumber, out var task))
{
Task.Run(() => task).Wait();
}
actionNumber++;
}
Run Code Online (Sandbox Code Playgroud)
解决方案 B: 保持一切不变。将异步任务方法包装到另一个 void 方法中,该方法本身等待任务方法。将此 void 方法放入操作字典中。
方案C: 将所有的async Task Method转为void Method,并重写await为.Result。
还有其他更好的解决方案吗?我倾向于选择解决方案 A,因为其他开发人员更容易查看字典并清楚地看到所有内容都必须是任务。
怎么样Dictionary<int, Func<Task>>?您可以在那里添加所有异步方法并在执行时等待它们。如果您想添加返回 void 的非异步方法,只需将其包装为:
Func<Task> wrapper = () => {
simpleSyncMethod();
return Task.CompletedTask;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |