我使用以下类来对远程服务器进行异步调用。
http://www.matlus.com/httpwebrequest-asynchronous-programming/
我打电话的方法是:
public static void PostAsync(string url, Dictionary<string, string> postParameters,
Action<HttpWebRequestCallbackState> responseCallback, object state = null,
string contentType = "application/json")
{
var httpWebRequest = CreateHttpWebRequest(url, "POST", contentType);
var requestBytes = GetRequestBytesPost(postParameters);
httpWebRequest.ContentLength = requestBytes.Length;
httpWebRequest.BeginGetRequestStream(BeginGetRequestStreamCallback,
new HttpWebRequestAsyncState()
{
RequestBytes = requestBytes,
HttpWebRequest = httpWebRequest,
ResponseCallback = responseCallback,
State = state
});
}
从调用代码我使用以下代码处理结果:
private void UserLogin()
{
var postParameters = new Dictionary<string, string>();
postParameters.Add("Email", tbEmailAddress.Text);
postParameters.Add("Password", tbPassword.Password);
HttpSocket.PostAsync("URL", postParameters, HttpWebRequestCallback, null);
this.ShowProgressIndicator();
}
private void HttpWebRequestCallback(HttpWebRequestCallbackState callbackState)
{
if (callbackState.Exception != null)
{
MsgBox.Show("Error message");
}
else
{
// do work
}
this.HideProgressIndicator();
}
所以UserLogin调用web服务并显示进度指示器,在HttpWebRequestCallback中,如果出现错误并隐藏进度指示器,我想向用户显示一个消息框。
当发生这种情况时,当我尝试显示消息框或执行此操作时,我收到错误“跨线程操作无效”.HideProgressIndicator();
我知道UI线程不同,我无法从HttpWebRequestCallback访问它,但我不知道如何实现我的要求。
你能告诉我该怎么办?
答案 0 :(得分:0)
在WPF应用程序中,我使用以下内容,仅使用Invoke
而不是BeginInvoke
。据我了解,Windows Phone不存在Invoke
,因此以下内容应该有效:
if (callbackState.Exception != null)
{
this.Dispatcher.BeginInvoke((Action)delegate()
{
MsgBox.Show("Error message");
});
}
else
{
// do work
}
this.Dispatcher.BeginInvoke((Action)delegate()
{
this.HideProgressIndicator();
});