我正在用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没有给予出线程错误,但它令人抓狂。
任何小费都很感激,非常感谢。
1条答案
按热度按时间v8wbuo2f1#
正如其他人所提到的,您可以使用
Queue
和一个方法来检查队列大小,并将DoWork
的方法相互链接。但要注意,如果DoWork
方法中的一个发生异常,所有的工作链都将停止。您可以使用以下示例代码: