C# 螺纹';s join()方法赢得';在Windows Phone 8中,等待thead完成是不可行的

C# 螺纹';s join()方法赢得';在Windows Phone 8中,等待thead完成是不可行的,c#,multithreading,authentication,windows-phone-8,C#,Multithreading,Authentication,Windows Phone 8,我正在为WP8做一个SharpBox验证。我搜索了“等待线程完成”,得到了很多答案,建议使用join()。因此,我将其添加到单击处理程序中的代码中: private async void uploadBtn_Tap(object sender, System.Windows.Input.GestureEventArgs e) { System.Threading.Thread thread = new System.Threading.Thread(getMyToken);

我正在为WP8做一个SharpBox验证。我搜索了“等待线程完成”,得到了很多答案,建议使用
join()
。因此,我将其添加到单击处理程序中的代码中:

 private async void uploadBtn_Tap(object sender, System.Windows.Input.GestureEventArgs e)
 {
     System.Threading.Thread thread = new System.Threading.Thread(getMyToken);
     thread.Start(); // Start a new non-UI thread to handle the request
     thread.Join();

     // The following codes must wait for the result of getMyToken!!!

     // the rest of the authenticating codes here
 }
以及非UI线程的
getMyToken
方法(以下所有变量都在构造函数之前声明,因此可以在其他方法中重复使用):

下面的代码
thread.Join()仅挂起,调试器仅到达
GOT IN
。如果我删除
thread.join()
,下面的代码
thread.Join()抛出
NullReferenceException
,因为非UI线程尚未完成其工作

但是如果我删除下面所有的代码
thread.join()
线程连接()本身,调试器可以到达
Done


我不知道我做错了什么。谢谢。

getMyToken
中删除
async
关键字,然后从
点击
处理程序中这样调用它:

await Task.Run(() => getMyToken());

这将在后台线程上运行DropBox代码(可能DropBox API正在进行网络调用,可能需要很长时间),但在API返回之前,请保持UI响应。

您需要了解有关async Wait的一些基本知识。您将方法标记为异步,但从未在其中使用wait。没有等待的异步方法总是同步的。不要使用线程,即使你这样做了,也不要启动它并立即调用join。您始终可以同步调用该方法(至少可以保存一个线程)。不要阻塞UI线程。等等。有几个问题。如果我将那些
requestToken
getMyToken
带到单击处理程序中的UI线程,它将挂在那里,不会做任何事情。人们说它应该在非UI线程中处理,所以这就是我创建另一个线程的原因
getMyToken
方法中,但是有人说它应该在UI线程中处理,所以我决定将它返回到click处理程序。这就是问题发生的时候。你对此有什么建议吗?幸好它不起作用,因为那太糟糕了。您正试图阻止UI线程。我很惊讶操作系统没有把你拒之门外。看起来我的代码有问题,所以不会显示网页。不管怎样,你的解决方案实现了我想要的,最终它以正确的顺序运行
await Task.Run(() => getMyToken());