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 - Fatal编程技术网

C# 什么在我的异步函数设置中阻塞了主线程?

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块。我的代码的哪一部分导致了这种情况? 任何帮助都将不胜感激

//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是返回的列表BTW
public async void
s是火与忘。我不认为您显示的代码中有任何内容会阻止您的应用程序。