Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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# 创建新的非UI线程以在windows phone 8中执行请求_C#_Multithreading_Windows Phone 8_Sharpbox - Fatal编程技术网

C# 创建新的非UI线程以在windows phone 8中执行请求

C# 创建新的非UI线程以在windows phone 8中执行请求,c#,multithreading,windows-phone-8,sharpbox,C#,Multithreading,Windows Phone 8,Sharpbox,我使用SharpBox 1.2授权代码如下: private async void toDropBoxBtn_Tap(object sender, System.Windows.Input.GestureEventArgs e) { config = CloudStorage.GetCloudConfigurationEasy(nSupportedCloudConfigurations.DropBox) as DropBoxConfiguration; DropB

我使用SharpBox 1.2授权代码如下:

private async void toDropBoxBtn_Tap(object sender, System.Windows.Input.GestureEventArgs e)
    {
      config = CloudStorage.GetCloudConfigurationEasy(nSupportedCloudConfigurations.DropBox) as DropBoxConfiguration;
      DropBoxRequestToken requestToken = DropBoxStorageProviderTools.GetDropBoxRequestToken(config, "7nu03leznnz6x74", "ex3gge8av7kp9lq");
      //it hangs at the line above ^ (requestToken)
      String AuthorizationUrl = DropBoxStorageProviderTools.GetDropBoxAuthorizationUrl(config, requestToken);
      ICloudStorageAccessToken accessToken = DropBoxStorageProviderTools.ExchangeDropBoxRequestTokenIntoAccessToken(config, "7nu03leznnz6x74", "ex3gge8av7kp9lq", requestToken);
    }
查看文档说明

SharpBox库具有许多操作的同步和异步功能。这两种表单对于桌面使用都很有用,但同步版本不能直接在Windows Phone应用程序中使用,因为这些调用会阻塞正在运行的UI线程,从而阻塞整个应用程序

异步函数可以在UI线程中使用。如果所需函数仅存在于同步变量中,则可以在另一个非UI线程中运行这些函数,并使用回调返回结果

看起来这就是我的代码挂起的问题。这就是为什么我决定创建一个新线程来处理requestToken行。我发现的大多数建议是:

System.Threading.Thread thread = new System.Threading.Thread(getMyToken);
thread.Start();
使用getMyToken,如下所示:

 private void getMyToken()
    {
        MessageBox.Show("In getMyToken()");
        requestToken = DropBoxStorageProviderTools.GetDropBoxRequestToken(config, "7nu03leznnz6x74", "ex3gge8av7kp9lq");
    }
当然,我已经声明了静态DropboxRequestTokenRequestToken;和静态DropBoxConfiguration配置;在构造函数之前

因此,我的新代码将是:

config = CloudStorage.GetCloudConfigurationEasy(nSupportedCloudConfigurations.DropBox) as DropBoxConfiguration;
MessageBox.Show("Done 1st!");
System.Threading.Thread thread = new System.Threading.Thread(getMyToken);
thread.Start();
String AuthorizationUrl = DropBoxStorageProviderTools.GetDropBoxAuthorizationUrl(config, requestToken);
MessageBox.Show("Done 2nd!");
ICloudStorageAccessToken accessToken = DropBoxStorageProviderTools.ExchangeDropBoxRequestTokenIntoAccessToken(config, "7nu03leznnz6x74", "ex3gge8av7kp9lq", requestToken);
是的,我把那些留言盒放在那里跟踪它的去向。问题是我先做完了!,然后做第二!当它应该先完成的时候!,在getMyToken中,然后完成第2个!。但就在第二次完成之后!是getMyToken方法引起的System.UnauthorizedAccessException异常,刚好在进入该方法之后,在MessageBox.ShowIn getMyToken中发生异常;线路

我不知道发生了什么事。请随意询问更多信息,因为我可能无法在本文中清楚地描述它。
谢谢您抽出时间。

我找到了。将所有代码放入getMyToken中,它就会工作,而不仅仅是一个requestToken。因此,我的事件处理程序中的代码只是:

private async void toDropBoxBtn_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
  System.Threading.Thread thread = new System.Threading.Thread(getMyToken);
  thread.Start();
}

只能从UI线程显示消息框。使用另一种方法显示诊断消息,如Debug.WriteLine,它将在Visual Studio的“输出”窗口中写入,或者使用Dispatcher.BeginInvoke打开带有UI线程的消息框谢谢提示。现在我可以跟踪getMyToken,但它仍然挂起在requestToken行……我使用Environment.CurrentManagedThreadId.ToString检查getMyToken之前及其内部的线程ID。它们是不同的1和5。天啊,看起来UI线程不是问题所在。。。