Windows-8プログラムでは、次のようにHttpWebRequest.BeginGetRequestStreamを呼び出しています。ここで、httpConnectionは以前に設定されています。
private System.Net.HttpWebRequest httpConnection;
public System.IO.Stream OutputStream
{
get
{
lock(syncobj)
{
httpConnection.BeginGetRequestStream
(new AsyncCallback(getRequestResultCallback), null);
...
}
}
}
このコードは、Windows Phone 7で問題なく実行されます。同期の問題があるため、ここで説明する必要はありません。BeginGetRequestStreamを実行するコードと、getRequestResultCallbackを実行するコードが異なるスレッド上にあることを期待しています。getRequestResultCallbackはAsyncCallbackを介して実行されるため、これが当てはまると思いました。これはWindows7にありますが、常にWindows 8にあるわけではありません。以下に、BeginGetRequestStreamとgetRequestResultCallbackが同じスレッドで実行されている実行を示すスタックトレースを追加しました。
この問題の理解にご協力いただければ幸いです。
よろしくお願いします、ジョン・エマーソン
ua-desktop.exe!com.webalo.up.ua.wp.net.WpUaHttpRequest.getRequestResultCallback(System.IAsyncResult result)120行目C# System.dll!System.Net.LazyAsyncResult.Complete(System.IntPtr userToken)+0x65バイト System.dll!System.Net.ContextAwareResult.CaptureOrComplete(ref System.Threading.ExecutionContext cachedContext、bool returnContext)+0x81バイト System.dll!System.Net.ContextAwareResult.FinishPostingAsyncOp()+0x24バイト System.dll!System.Net.HttpWebRequest.BeginGetRequestStream(System.AsyncCallbackコールバック、オブジェクト状態)+0x289バイト ua-desktop.exe!com.webalo.up.ua.wp.net.WpUaHttpRequest.OutputStream.get()31行目+ 0x37バイトC# ..。 mscorlib.dll!System.Threading.Tasks.Task.InnerInvoke()+0x49バイト mscorlib.dll!System.Threading.Tasks.Task.Execute()+0x32バイト mscorlib.dll!System.Threading.Tasks.Task.ExecutionContextCallback(object obj)+0x15バイト mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContextexecutionContext、System.Threading.ContextCallbackコールバック、オブジェクト状態、boolpreserveSyncCtx)+0xa7バイト mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executeContext、System.Threading.ContextCallbackコールバック、オブジェクト状態、boolpreserveSyncCtx)+0x16バイト mscorlib.dll!System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref System.Threading.Tasks.Task currentTaskSlot)+0xcaバイト mscorlib.dll!System.Threading.Tasks.Task.ExecuteEntry(bool bPreventDoubleExecution)+0xb3バイト mscorlib.dll!System.Threading.Tasks.Task.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()+0x7バイト ..。