.net 如何在触发另一个方法的onComplete之后异步运行几个方法(都有onComplete回调)?

p1iqtdky  于 2023-01-10  发布在  .NET
关注(0)|答案(1)|浏览(180)

我正在用Unity和C#做一个小项目。
我有一个person类示例列表,每个示例都有以下方法,

public void DoWork(Action onComplete) { }  //onComplete is triggered when everything is done in the method.

我想在另一个人的onComplete触发后,异步运行所有人的DoWork方法,也就是说第一个人异步DoWork,在其onComplete触发后,第二个人异步DoWork,直到所有人完成工作。
方法DoWork目前不是一个异步函数,如果我不需要改变这一点就太好了。
我想知道我应该如何设计代码?是否有可能在不使用.net任务的情况下实现这个目的?如果没有,我如何修改DoWork方法?顺便说一句,Unity不允许我在非主线程的线程(如任务线程)中运行该方法。
我尝试了下面的解决方案。DoWork有一个onComplete回调函数,因为在它里面有一个工具.Start()函数,它有一个onComplete回调函数,需要执行,DoWork只能在工具.Start()onComplete被触发时完成。所以我删除了DoWork的onComplete回调函数,并编写了下面的代码。

public async Task DoWork()
{
    bool allowExit = false;
    tool.Start(() =>        //Start function has an Action onComplete callback, and DoWork can only be done when Start onComplete is triggered
    {
        allowExit = true;
    });
    while (!allowExit) { await Task.Yield(); }
}

public async void AllPersonsDoWork()    //try to run all persons' DoWork methods asynchronously one by one
{
    foreach (var person in personList)
    {
        await person.DoWork();
    }
}

Unity3D没有给予出线程错误,但它令人抓狂。
任何小费都很感激,非常感谢。

v8wbuo2f

v8wbuo2f1#

正如其他人所提到的,您可以使用Queue和一个方法来检查队列大小,并将DoWork的方法相互链接。但要注意,如果DoWork方法中的一个发生异常,所有的工作链都将停止。
您可以使用以下示例代码:

public Queue<Person> TasksToDo;
    
    public async Task CheckQueue()
    {
        if( TasksToDo.Count > 0){
            var person = TasksToDo.Dequeue();
            await person.DoWork(CheckQueue);
        }
    }
    
    public class Person
    {
        public async Task DoWork(Func<Task> onComplete)
        {
            //..... do work
            if (onComplete != null)
            {
                await onComplete();             
            }
        }
    }

相关问题