public void RemoteInsert()
{
String dataSet = "dataset=" + json.ToString();
accessKey = mobRemoteDB.accessKey;
String paramaters = "?llcommand=sndmsg&" + "ak=" + accessKey + "&command=remoteinsert&" + dataSet;
String url = mobRemoteDB.baseUrlForRemoteInsert + paramaters;
HttpWebRequest webRequest = (HttpWebRequest)System.Net.WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "application/json";
if (NetworkInterface.GetIsNetworkAvailable() & IsDataValid)
{
webRequest.BeginGetRequestStream(newAsyncCallback(GetRequestStreamCallback),webR equest);
}
}
void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
}
void GetResponseCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
JObject json_response = JObject.Parse(streamReader.ReadToEnd());
String key = (String)json_response["ret"];
JObject dic = (JObject)json_response["retdic"];
}
catch(WebException e)
{
}
}
RemoteInsert () 메서드가 콜백 GetResponseCallback을 기다리도록하고 싶습니다. 나는 많은 것을 시도한 것처럼 그것을 할 수 없습니다.
어떤 시체라도 도와주세요. 이 응답이 올 때까지 메인 스레드가 다른 작업을 수행하는 것을 원하지 않습니다. 제안하십시오. 그 응답 이후에 다음 실행에 사용해야합니다.
Here My code is going like
1. Task(A).running----await
2. ------------------------------->Task(B)
3 ---------Response From Task(A)------->Task(C)
첫 번째 작업 A 완료, 작업 (C) 성공과 같이 작업 (A) 성공과 같이 구현하고 싶습니다. 다음 과제 (B)
질문을 이해했다면 호출 스레드에서 웹 요청을 수행하고 계속하기 전에 완료 될 때까지 기다리시겠습니까?
RemoteInsert()
async / await를 사용하고 GetResponseAsync()
메서드를 사용하여 한 번의 호출로 응답 개체를 가져옴으로써 메서드를 단순화 할 수 있습니다 . 이 같은:
public async Task RemoteInsert()
{
String dataSet = "dataset=" + json.ToString();
accessKey = mobRemoteDB.accessKey;
String paramaters = "?llcommand=sndmsg&" + "ak=" + accessKey + "&command=remoteinsert&" + dataSet;
String url = mobRemoteDB.baseUrlForRemoteInsert + paramaters;
HttpWebRequest webRequest = (HttpWebRequest)System.Net.WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "application/json";
if (NetworkInterface.GetIsNetworkAvailable() && IsDataValid)
{
// Await the GetResponseAsync() call.
using(var response = await webRequest.GetResponseAsync().ConfigureAwait(false))
{
// The following code will execute on the main thread.
using (var streamResponse = response.GetResponseStream())
{
using (StreamReader streamReader = new StreamReader(streamResponse))
{
JObject json_response = JObject.Parse(streamReader.ReadToEnd());
String key = (String)json_response["ret"];
JObject dic = (JObject)json_response["retdic"];
}
}
}
}
}
더 이상 필요하지 않으므로 다른 두 가지 방법을 잃게됩니다.
이 메서드를 호출하면 Wait () 할 수 있습니다.
RemoteInsert().Wait();
그러나 WP는이를 방지하기 위해 좋은 비동기 패턴을 적용하려고합니다. 이 경우 UI 스레드를 차단하려면 무엇이 필요합니까?
RemoteInsert ()를 호출하는 메소드에서 ... 일종의 버튼 클릭 이벤트라고 가정하겠습니다 ...이 작업을 수행 할 수 없습니까?
public async void Button_Click()
{
// First call Remote insert, and await the result.
// The web-request will not block the UI thread.
await RemoteInsert();
// This code will be executed after RemoteInsert() completes:
... perform additional tasks that are dependant on RemoteInsert()
}
즉, UI 스레드를 차단하는 대신 RemoteInsert () 메서드가 완료된 후에 다른 메서드를 실행합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다