я в настоящее время следующие:Выполняется ли это асинхронно?
var tasks = new List<Task>();
foreach (myObject obj in myObjectList)
{
tasks.Add(downloadBitmap(obj.profilePath, obj.id));
}
await Task.WhenAll(tasks);
downloadBitmap
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
RequestState myRequestState = new RequestState();
myRequestState.request = request;
// Start the asynchronous request.
IAsyncResult result = request.BeginGetResponse(new AsyncCallback(RespCallback), Tuple.Create(myRequestState, actorID));
// this line implements the timeout, if there is a timeout, the callback fires and the request becomes aborted
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), request, DefaultTimeout, true);
// The response came in the allowed time. The work processing will happen in the
// callback function.
allDone.WaitOne();
RespCallBack
Tuple<RequestState, int> state = (Tuple<RequestState, int>)asynchronousResult.AsyncState;
RequestState myRequestState = state.Item1;
int actorID = state.Item2;
try
{
HttpWebRequest myHttpWebRequest = myRequestState.request;
myRequestState.response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult);
// Read the response into a Stream object.
Stream responseStream = myRequestState.response.GetResponseStream();
myRequestState.streamResponse = responseStream;
Bitmap bitmap = new Bitmap(responseStream);
// Do some work here
}
catch (WebException e)
{
Console.WriteLine("\nRespCallback Exception raised!");
Console.WriteLine("\nMessage:{0}", e.Message);
Console.WriteLine("\nStatus:{0}", e.Status);
}
finally
{
// Release the HttpWebResponse resource.
myRequestState.response.Close();
}
allDone.Set();
Я получил большую часть этого из MSDN
сайта. Я также получать предупреждение:
This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.
для функции DownloadBitmap
.
Я понимаю, что я не использую await
в этой функции, но причина, я думал, что это не было необходимо в любом месте потому, что BeginGetResponse
уже asynchronous
?
Не уверен, что, если мое понимание этого совершенно правильно ...
В этом методе вы запускаете асинхронный вызов с 'request.BeginGetResponse'. Но ваш текущий поток блокируется при вызове 'allDone.WaitOne();' и он только бодрствует, когда 'другой поток 'выбирается для обработки асинхронного результата и вызывает' allDone.Set(); '. Это не правильный способ реализации asynch. Вы можете взглянуть на: http://stackoverflow.com/questions/10565090/getting-the-response-of-a-asynchronous-httpwebrequest –
Ваше использование шаблона APM вместе с WaitHandle не имеет смысла. Просто используйте 'wait WebRequest.GetResponseAsync'. Вы уже ждали. Почему все это сложное вещество APM? – usr
Кроме того, это не является хорошим вопросом для переполнения стека. Это стена кода, которая нуждается в проверке. – usr