Asynchronous 如果由ScheduledAgent触发,则GetStringAsync出错,但在WP8应用程序使用期间没有错误

Asynchronous 如果由ScheduledAgent触发,则GetStringAsync出错,但在WP8应用程序使用期间没有错误,asynchronous,windows-phone-8,webclient,Asynchronous,Windows Phone 8,Webclient,我有一个webclient的包装器,用于检索一些数据。WP8应用程序和WP8 ScheduledAgent正在使用相同的函数 不知何故,当WP8应用程序使用该函数时,不会出现错误,并且会正确返回。 但是,当ScheduledAgent使用该函数时,它在下面的粗体代码处出错。我试着接球,但没有接球。通过调试器,GetSTringAsync(uri)已毫无例外地完成。错误似乎只有在将返回任务分配给结果字符串时才会发生 我收到的错误是: System.Windows.ni.dll中发生类型为“Syst

我有一个webclient的包装器,用于检索一些数据。WP8应用程序和WP8 ScheduledAgent正在使用相同的函数

不知何故,当WP8应用程序使用该函数时,不会出现错误,并且会正确返回。 但是,当ScheduledAgent使用该函数时,它在下面的粗体代码处出错。我试着接球,但没有接球。通过调试器,GetSTringAsync(uri)已毫无例外地完成。错误似乎只有在将返回任务分配给结果字符串时才会发生

我收到的错误是: System.Windows.ni.dll中发生类型为“System.UnauthorizedAccessException”的未处理异常


公共类HttpClient:WebClient .. 专用异步任务GetStringAsync(字符串strUri) { Uri=新Uri(strUri); 字符串结果=string.Empty; 尝试 { 结果=等待GetStringAsync(uri); } 捕获(例外情况除外) { MessageBox.Show(例如Message); } 返回结果; } ... 私有任务GetStringAsync(Uri请求Uri) { TaskCompletionSource tcs=新的TaskCompletionSource(); 尝试 { this.DownloadStringCompleted+=(s,e)=> { 如果(e.Error==null) { tcs.TrySetResult(e.Result); } 其他的 { tcs.TrySetException(即错误); } }; 下载StringAsync(requestUri); } 捕获(例外情况除外) { tSystexception(ex); } if(tcs.Task.Exception!=null) { 抛出tcs.Task.Exception; } 返回tcs.Task; }

如果我遗漏了什么,请给出建议。

我的问题是因为我在模型中使用图钉作为对象类型之一。显然,在调度代理中,它无法访问该对象类型,因此抛出了上述错误。

这可能是由于调度代理的主要方法是
async void
(它不能这样做)。另外,您应该使用Microsoft的便携式
HttpClient
(或
Microsoft.Bcl.Async
,它提供了一个
WebClient.downloadstringtasksync
)。它们都能处理所有特殊情况,比如异常堆栈(当前代码无法正确处理)。非常感谢!你一针见血地解决了问题。这可能是问题之一。另一个原因是,我的模型使用了图钉,显然是在计划代理模式下,它无法访问它。 public class HttpClient : WebClient .. private async Task GetStringAsync(string strUri) { Uri uri = new Uri(strUri); string result = string.Empty; try { result = await GetStringAsync(uri); } catch (Exception ex) { MessageBox.Show(ex.Message); } return result; } ... private Task GetStringAsync(Uri requestUri) { TaskCompletionSource tcs = new TaskCompletionSource(); try { this.DownloadStringCompleted += (s, e) => { if (e.Error == null) { tcs.TrySetResult(e.Result); } else { tcs.TrySetException(e.Error); } }; this.DownloadStringAsync(requestUri); } catch (Exception ex) { tcs.TrySetException(ex); } if (tcs.Task.Exception != null) { throw tcs.Task.Exception; } return tcs.Task; }