Silverlightは同期Web要求をサポートしていません。このため、私はSimple Asynchronous Operation Runnerと書いた。その目的の1つは、コードが同期しているかのようにコードを記述し、ランナーコードで動作するように変更できることです。
まず、パート1からAsyncOperationService
の小さなコードを取得してプロジェクトに追加します(実際に使用するのに重要でない記事が少し重いと気にしないでください)。すでに「同期テンプレート」として提供されたコードを使用して
我々は、同様のプロジェクトに追加しますので、我々はそれらを記述しますGetRequestStream
とGetResponseStream
ためAsyncOperation
実装のカップルを必要と見ることができます: -
public static class WebRequestAsyncOps
{
public static AsyncOperation GetRequestStreamOp(this WebRequest request, Action<Stream> returnResult)
{
return (completed) =>
{
request.BeginGetRequestStream((result) =>
{
try
{
returnResult(request.EndGetRequestStream(result));
completed(null);
}
catch (Exception err)
{
completed(err);
}
}, null);
};
}
public static AsyncOperation GetResponseOp(this WebRequest request, Action<WebResponse> returnResult)
{
return (completed) =>
{
request.BeginGetResponse((result) =>
{
try
{
returnResult(request.EndGetResponse(result));
completed(null);
}
catch (Exception err)
{
completed(err);
}
}, null);
};
}
}
今、あなたはおそらく、私はあなたが(既存AsyncOperationServiceクラスに注入する)だけでなく、手でこのAsyncOperation
を持ってお勧めしますので、UIに進捗状況を報告したいと思うアップロードファイルをチャンクしている場合: -
public static AsyncOperation SwitchToUIThread()
{
return (completed => Deployment.Current.Dispatcher.BeginInvoke(() => completed(null)));
}
今、私たちはあなたのコードの非同期バージョンクレアーレすることができます -
IEnumerable<AsyncOperation> Chunker(Action<double> reportProgress)
{
double progress = 0.0;
Chunk chunk = new Chunk();
// Setup first chunk;
while (chunk != null)
{
Stream outStream = null;
HttpWebRequest req = ...
yield return req.GetRequestStreamOp(s => outStream = s);
// Do stuff to and then close outStream
WebResponse response = null;
yield return req.GetResponseOp(r => response = r);
// Do stuff with response throw error is need be.
// Increment progress value as necessary.
yield return AsyncOperationService.SwitchToUIThread();
reportProgress(progress);
chunk = null;
if (moreNeeded)
{
chunk = new Chunk();
// Set up next chunk;
}
}
}
最後に、あなたはそれを実行し、すべてのエラーを処理する必要があります -
Chunker.Run((err) =>
{
if (err == null)
{
// We're done
}
else
{
// Oops something bad happened.
}
});
を