我对C#比较陌生,在异步方法中检索textbox值时遇到了一些问题。我使用线程来检索UI中的文本输入并在代码中使用它。VS2010接受我的代码,但当我开始调试时,它给了我以下异常Invalid cross-thread access。想法?我是不是遗漏了什么?
public void Response_Completed(IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
JObject rootObject = JObject.Load(new JsonTextReader(streamReader));
string tracknum = trackid.Text; // Invalid cross-thread access exception
string source = rootObject[tracknum]["source"].ToString();
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
//removed
});
}
}注意:我正尝试在Windows Phone 7平台上执行此操作
发布于 2012-10-31 11:54:47
你应该在UI线程上获取文本框值,而不是在其他线程上。Invoke method在UI线程上执行指定的委托:
string tracknum = (string)trackid.Invoke(new Func<string>(() => trackid.Text));编辑:
在Windows Phone上:
string tracknum = string.Empty;
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
tracknum = trackid.Text;
string source = rootObject[tracknum]["source"].ToString();
});发布于 2012-10-31 11:57:17
您将收到此类异常,因为您试图从创建对象的线程之外的其他线程访问对象(尝试异步访问该线程)。
为了解决这个问题,我们需要在拥有控件底层窗口句柄的线程上执行一个委托。在这种情况下,我们可以使用Invoke(Delegate method)
示例
public void Response_Completed(IAsyncResult result)
{
this.Invoke((MethodInvoker)delegate
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);
using (StreamReader streamReader = new StreamReader(response.GetResponseStream()))
{
JObject rootObject = JObject.Load(new JsonTextReader(streamReader));
string tracknum = trackid.Text; // Invalid cross-thread access exception
string source = rootObject[tracknum]["source"].ToString();
}
});
}MethodInvoker提供了一个简单的委托,用于调用带有空参数列表的方法。当调用控件的Invoke方法时,或者需要简单的委托但不想自己定义时,可以使用此委托。
谢谢,
我希望这对您有帮助:)
https://stackoverflow.com/questions/13150979
复制相似问题