我对C#有些新意,我在异步方法中检索textbox
值时遇到了一些问题。我是在UI中检索文本输入并在代码中使用它的线程。 VS 2010接受我的代码,但是当我开始调试时,它给了我以下异常
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平台上执行此操作
答案 0 :(得分:1)
您应该在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();
});
答案 1 :(得分:0)
您将收到此类异常,因为您尝试从与其创建时不同的线程访问对象(尝试异步访问该线程)
为了解决这个问题,我们需要在拥有控件底层窗口句柄的线程上执行委托。在这种情况下,我们可能会使用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
提供了一个简单的委托,用于调用带有void参数列表的方法。在调用控件的Invoke
方法时,或者当您需要一个简单的委托但不想自己定义一个委托时,可以使用此委托。
谢谢, 我希望你觉得这很有帮助:)