【问题标题】:Create a new non-UI thread to execute requests in windows phone 8在 windows phone 8 中创建一个新的非 UI 线程来执行请求
【发布时间】:2015-06-29 19:20:22
【问题描述】:

我使用 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);
    }

查看文档here 指出

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");
    }

当然,我已经在构造函数()之前声明了static DropBoxRequestToken requestToken;static DropBoxConfiguration config;

所以我的新代码是:

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);

是的,我把那些 MessageBox 用来跟踪它的去向。问题是我得到 “Done 1st!”,然后 “Done 2nd!” 应该是 “Done 1st!”,“在 getMyToken() 中” 然后 “第二次完成!”。但是在"Done 2nd!"之后是getMyToken方法引起的System.UnauthorizedAccessException异常,刚刚进入方法后(MessageBox.Show("In getMyToken()");行出现异常)。

我不知道发生了什么。随意询问更多信息,因为我可能不会在这篇文章中清楚地描述它。 感谢您的宝贵时间。

【问题讨论】:

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

标签: c# multithreading windows-phone-8 sharpbox


【解决方案1】:

我找到了。将所有代码放入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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多