Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何返回一个值,该值取决于在方法中启动的协同例程的结果?(C#)_C#_Unity3d_Coroutine - Fatal编程技术网

如何返回一个值,该值取决于在方法中启动的协同例程的结果?(C#)

如何返回一个值,该值取决于在方法中启动的协同例程的结果?(C#),c#,unity3d,coroutine,C#,Unity3d,Coroutine,我有一个返回bool的公共方法。该方法启动一个co例程。co例程决定bool的值。我刚刚意识到,该方法将返回bool,而无需等待协程完成。我不知道如何实现这一点 举个例子。假设有一个单独的类称之为: public bool CheckListForName(string username) { StartCoroutine(DownloadPlayer(username)); return playerExists; } 我意识到这段代码在没有上下文的情况下毫无意义,但是如果b

我有一个返回bool的公共方法。该方法启动一个co例程。co例程决定bool的值。我刚刚意识到,该方法将返回bool,而无需等待协程完成。我不知道如何实现这一点

举个例子。假设有一个单独的类称之为:

public bool CheckListForName(string username)
{
    StartCoroutine(DownloadPlayer(username));
    return playerExists;
}
我意识到这段代码在没有上下文的情况下毫无意义,但是如果bool“playerExists”在默认情况下设置为“False”,但是协同程序“DownloadPlayer”会发现“playerExists”实际上应该为true,这无关紧要,因为在协同程序找到正确的值之前,“CheckListForName”已经返回了“False”


我对编程比较陌生,所以非常感谢您的帮助

> P>您可能需要考虑使用Acyc/As/< < /P>
public async Task<bool> CheckListForName(string username)
{
    await DownloadPlayer(username);
    return playerExists;
}


你必须等待共同例行程序完成。这基本上就是
await
在等待方法上所做的。@Fildor:我也不熟悉Unity,除了我从这些问题中收集到的东西。显然,Unity协例程是迭代器方法,因此它使用
yield-return
打破迭代器状态机,而不是
wait
打破异步状态机。讨厌。它明显提前了async/await的日期。统一往往是C#编译器进步的背后@BenMora:C#的
async
关键字将一个方法变成了一个一流的协同例程。然而,Unity并没有使用一种从未为此目的而设计的机制来执行联合例程。如果您可以使用
async
await
,这会更好,但它往往会“感染”代码,而syncasync转换将涉及通常建议不要使用的代码,因为它可能会造成死锁。阅读Unity文档,了解如何等待协同例程完成,或者重新设计方法及其调用程序以使用回调。不幸的是,我也不能给你任何建议。你的观点很有道理。尽管如此,我相信我已经非常清楚这一区别,并且已经正确和负责任地建议了OP。谢谢大家对这一点的解释!我现在知道我不知道的,这是一个令人惊奇的地方!我将深入研究大家谈论的所有这些“sync/async/await”内容。如果您添加这些内容以供进一步阅读,那就太好了。请记住,这(第一个片段)意味着
DownloadPlayer
具有设置
playerExists
字段的副作用。这既不明显,也不可取。所以推荐的内容应该是最后一段,谢谢你的回复。我尝试了这两种方法,但都没有成功。我不断收到此错误消息的不同版本:“'IEnumerator/bool'不包含'GetAwaiter'的定义,并且找不到可访问的扩展方法'GetAwaiter',该方法接受'IEnumerator/bool'类型的第一个参数(是否缺少using指令或程序集引用?)”这是统一的。该方法返回一个
Coroutine
实例。查看unity手册以找到解决方案。在Vanilla.Net/C#中,没有。^^^^正如@madreflection正确指出的那样,有一个类似于unity的“协同程序”的概念。只是没有这样称呼,所以我会使用相应的术语来避免混淆。
if(await CheckListForName("foo"))
   DoSomething();
var playerExistsTask = CheckListForName("foo"); //doesn't wait for task to finish here
Dothings();
bool playerExists = await playerExistsTask;//waits here