I've an extension method for WebClient (WP8)
public static Task<string> DownloadStringTask(this WebClient webClient, Uri uri)
{
var tcs = new TaskCompletionSource<string>();
webClient.DownloadStringCompleted += (s, e) =>
{
if (e.Error != null)
{
tcs.TrySetException(e.Error);
}
else if (e.Cancelled)
{
tcs.TrySetCanceled();
}
else
{
tcs.TrySetResult(e.Result);
}
};
webClient.DownloadStringAsync(uri);
return tcs.Task;
}
and the call to this method
public string GetResult()
{
var task = new WebClient().DownloadStringTask(new Uri("http:\\www.foo.com"));
return task.Result;
}
The DownloadStringCompleted is never executed and obviously there is no result, if I press the pause button on VS always is waiting in task.Result.
Any idea?
Thanks in advance.
Is GetResult
executed from the main thread? In that case, it may be a deadlock. If I remember correctly, the callback of the WebClient
is executed on the main thread, which cannot happen since you're blocking it by calling task.Result
.
You have multiple ways to prevent this issue:
Use a HttpWebRequest
instead of a WebClient
Call GetResult
from another thread
Execute the task asynchronously by using task.ContinueWith
instead of directly task.Result
Rewrite your method using async/await keywords