C# 创建新的非UI线程以在windows phone 8中执行请求
我使用SharpBox 1.2授权代码如下: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
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线程不是问题所在。。。