C# 任务的Wait()方法阻塞该任务

C# 任务的Wait()方法阻塞该任务,c#,xamarin,task,C#,Xamarin,Task,我在Xamarin工作,在那里我有一个任务,我从第一个菜单页开始,浏览其他几个菜单页,然后在打开一个结束页时等待它完成。为此,我在启动任务时将其保存在静态字段中: private static Task myTask; public static void sync(User user) { if (myTask== null || myTask.IsCompleted) { myTaskStarted = true;

我在Xamarin工作,在那里我有一个任务,我从第一个菜单页开始,浏览其他几个菜单页,然后在打开一个结束页时等待它完成。为此,我在启动任务时将其保存在静态字段中:

    private static Task myTask;

    public static void sync(User user)
    {
        if (myTask== null || myTask.IsCompleted) {
            myTaskStarted = true;
            //Note: do not trust on the variable being filled in immediately after the start of the task. It takes a minute. Use the flag
            myTask= AsyncMyTask(user);
        }
    }
然后,我从另一个页面调用了一个方法,该方法只需等待myTask返回finnish,方法是在对myTask进行一些已启动且不为null的检查之后调用
myTask.wait()
。但是我看到,一旦调用
myTask.Wait()
myTask,调试器中的任务就被卡住了,无法继续执行。它卡住了。如果将
myTask.Wait()
替换为
myTask.Wait(1000)
myTask将在超时期间冻结。超时后,它将继续。这不是文档中描述的行为。有人能解释为什么从UI线程调用myTask.Wait()时AsyncMyTask方法被阻止吗


根据要求:等待MyTask方法:

    public async static Task<Boolean> AwaitMyTask()
    {
        if(!myTaskStarted && myTask== null)
        {
            return false;
        } else
        {
            while (myTask== null)
            {
                Task.Delay(10);
            }
        }
        //Stuck on the line below
        myTask.Wait();
        myTaskStarted = false;
        return myTask.IsCompleted;
    }
public异步静态任务waitingmytask()
{
如果(!myTaskStarted&&myTask==null)
{
返回false;
}否则
{
while(myTask==null)
{
任务延迟(10);
}
}
//卡在下面的线路上
myTask.Wait();
myTaskStarted=false;
返回myTask.IsCompleted;
}

任务。Wait
是一种同步等待任务的方法,它会阻塞线程。除非您可以指向说明其他内容的文档,否则我认为这是中描述的预期行为

Wait是一种同步方法,它使调用线程等待当前任务完成


要补充Peter的答案,请参见:您的问题中有一些缺失的部分,如果我诚实的话,您应该看看实际执行等待的方法。您使用的是
async
,但从不
wait
。你可以做
等待我的任务而不是
myTask.Wait()。这将以几乎相同的方式阻止。如果你想等待多个任务,那么你可以使用
Wait Task。当所有(…)
我试过这个方法时,它也会阻止我的任务的执行。当然它会阻止,
Wait
Wait
就是为了这个。如果您不想阻止当前执行,请从代码中删除
Wait
Wait
,但这是不可见的。因此,如果我理解正确,如果多个任务位于同一线程中,则从另一个任务调用task.Wait()将挂起所有这些任务。不是我所期望的,谢谢。据我所知,任务是在它自己的线程中自动启动的,所以,不,我认为如果调用任务,任务挂起是没有意义的。等等,应该只有调用挂起的方法的线程,不是两者都有。@Lavandysh可能您需要更新您的描述,因为您的问题的这一部分:
如果我将myTask.Wait()替换为myTask。Wait(1000)myTask在超时期间被冻结。
表明了预期的行为,因为您可能混淆了主任务和子任务的描述-此外,C#并没有说任务必须在一个单独的线程中运行,它们可以(默认情况下,它们甚至可以),但不必这样做。我不知道xamarin中的默认值指定了什么。