C# 什么在我的异步函数设置中阻塞了主线程?
我刚开始使用异步函数,正在运行mainthread块。我的代码的哪一部分导致了这种情况? 任何帮助都将不胜感激C# 什么在我的异步函数设置中阻塞了主线程?,c#,unity3d,C#,Unity3d,我刚开始使用异步函数,正在运行mainthread块。我的代码的哪一部分导致了这种情况? 任何帮助都将不胜感激 //mainthread function private void ShortestPathBetweenNodes(Node start , Node) { RunDijkstraAsync(start, target); } async void RunDijkstraAsync(Node start, Node target) { List<Node&g
//mainthread function
private void ShortestPathBetweenNodes(Node start , Node)
{
RunDijkstraAsync(start, target);
}
async void RunDijkstraAsync(Node start, Node target)
{
List<Node> path = new List<Node>();
path = await DijkstrAsync(start, target);
}
async Task<List<Node>> DijkstrAsync(Node start, Node target)
{
await Task.Run(() =>
{
//omitted function code. markedNode.previous is the List<Node> to return
return markedNode.previous;
});
}
//主线程函数
私有void节点间最短路径(节点开始,节点)
{
RunDijkstraAsync(开始,目标);
}
异步void RunDijkstraAsync(节点开始,节点目标)
{
列表路径=新列表();
路径=等待DijkstrAsync(开始,目标);
}
异步任务DijkstrAsync(节点开始,节点目标)
{
等待任务。运行(()=>
{
//省略的函数代码。markedNode.previous是要返回的列表
返回markedNode.previous;
});
}
我希望它在非主线程上运行异步,但它会阻止主线程。您看到的不是严格意义上的“阻止”本身,而是
async
代码的延续(即async
方法在wait
完成后的“剩余部分”)执行:
然而,团结确实为我们提供了一件重要的事情。正如您在上面的示例中所看到的,默认情况下,我们的异步方法将在unity主线程上运行。[…]之所以这样做,是因为Unity提供了一个名为UnitySynchronizationContext的默认SynchronizationContext,它自动收集每帧排队的任何异步代码,并继续在Unity主线程上运行它们
如果您将
.ConfigureAwait(false)
附加到等待的调用中,您应该避免这种行为-但请注意,这可能会干扰您在继续中使用Unity API的能力。在您的示例中,DijkstrAsync
将其返回类型声明为任务,但我看不到它返回任何内容。这是您的实际代码吗?@JohnWu我省略了与异步函数无关的部分代码。marked.previous是返回的列表BTWpublic async void
s是火与忘。我不认为您显示的代码中有任何内容会阻止您的应用程序。