1

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バイト
..。
4

0 に答える 0