Visual Web Express 2010に取り組んでいます。サーバーにファイルをアップロードし、呼び出し元の関数をブロックして、アップロードが完了したら解放しようとしています。ただし、メインスレッドのブロックが解除されることはありません。
public partial class MainPage : UserControl
{
private FileStream fileStream;
private static String responseStr = "";
private static ManualResetEvent evt = new ManualResetEvent(false);
public MainPage()
{
InitializeComponent();
HtmlPage.RegisterScriptableObject("App", this);
}
public void sendPhoto()
{
uploadFile();
}
private void uploadFile()
{
uploadDataToServer(url);
evt.WaitOne();
postProcess();
}
public static void postProcess()
{
HtmlPage.Window.Invoke("postProcess2", responseStr);
}
void uploadDataToServer(String url)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = "multipart/form-data; boundary=---------------------------" + _boundaryNo;
request.Method = "POST";
request.BeginGetRequestStream(writeCallback, request);
}
private void writeCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
MemoryStream memoryStream = new MemoryStream();
fileStream.CopyTo(memoryStream);
if (memoryStream != null)
{
memoryStream.Position = 0;
byte[] img = memoryStream.ToArray();
Stream postStream = request.EndGetRequestStream(asynchronousResult);
postStream.Write(img, 0, img.Length);
request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}
}
private void GetResponseCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamRead = new StreamReader(streamResponse);
string responseString = streamRead.ReadToEnd();
streamRead.Close();
streamResponse.Close();
response.Close();
responseStr = responseString;
evt.Set();
}
}
evt.WaitOne()
これで、uploadFileで使用すると、アプリ全体が待機状態になり、サーバーにリクエストが送信されません。つまり、コードが到達getResponseCallBack
しないため、アプリケーションがウェイクアップすることはありません。ただし、を使用しない場合、リクエストは成功しますが、関数に設定されており、リクエストが非同期であるevt.WaitOne()
ため、レスポンステキストを読み取ることができません。writeCallBack()
この問題を解決するにはどうすればよいですか?
私は理解できません: 1.リクエストがマルチスレッド/非同期の場合、なぜevt.WaitOne()がアプリ全体を待機させ、リクエストが完了しないのですか? 2.リクエストがシングルスレッドの場合、responseStr [getResponseCallBack()で設定]にアクセスしようとしたときにpostProcess()[evt.WaitOne()を削除]が適切なレスポンスセットを取得しないのはなぜですか。
[申し訳ありませんが、私はこれに不慣れで混乱しています]。
ありがとう。
申し訳ありませんが、私が使用していることを1つ言及するのを忘れましたsilverlight
。