代码之家  ›  专栏  ›  技术社区  ›  Thypari

任务、操作在同一词典或替代体系结构中?

  •  0
  • Thypari  · 技术社区  · 8 年前

    我希望我能在第一次尝试时正确地解释这一点:

    我有一个 Dictionary<int, Action> MyActions . 我有一个方法如下所示:

    int actionNumber = 0;
    while (isRunning) {
        if (Phases.TryGetValue(actionNumber, out var action))
        {
            action.Invoke();
        }
        actionNumber++;   
    }
    

    其思想是,每当前面的方法完成时,这些方法都会互相运行。当出现错误时,我会保存actionNumber,以便返回到正确的最后一个方法并从那里继续。

    我在字典中输入的方法最初只是简单的void方法。现在我发现我自己也必须在那里放置异步方法,因为其中一些方法已经在它们的体内等待。这意味着字典必须在其中保留void方法和异步任务方法。while循环必须有一个wait,否则它将在运行异步任务方法时继续。

    我的解决方案:

    解决方案A: 使词典成为 Dictionary<int, Task> MyActions 让每件事都成为一项任务,即使这是一个简单的无效方法。将while循环更改为:

        int actionNumber = 0;
    while (isRunning) {
        if (Phases.TryGetValue(actionNumber, out var task))
        {
            Task.Run(() => task).Wait();
        }
        actionNumber++;   
    }
    

    解决方案B: 保持一切原样。将异步任务方法包装到另一个等待任务方法的void方法中。将此void方法放入动作字典中。

    解决方案C: 将每个异步任务方法转换为void方法,然后等待重写。后果


    还有其他更好的解决方案吗?我倾向于使用解决方案A,因为其他开发人员更容易查看字典并清楚地看到所有这些都是任务。

    1 回复  |  直到 8 年前
        1
  •  4
  •   Jakub Binkowski    8 年前

    怎么样 Dictionary<int, Func<Task>> ? 您可以在那里添加所有异步方法,并在执行时等待它们。如果要添加返回void的非异步方法,只需使用以下内容将其包装:

    Func<Task> wrapper = () => {
       simpleSyncMethod();
       return Task.CompletedTask;
    }
    
    推荐文章