3

我对 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 平台上执行此操作

4

2 回答 2

1

您应该在 UI 线程而不是其他线程上获取文本框值。Invoke 方法在 UI 线程上执行指定的委托:

string tracknum = (string)trackid.Invoke(new Func<string>(() => trackid.Text));

编辑:

在 Windows 手机上:

string tracknum = string.Empty;
Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
       tracknum = trackid.Text;
       string source = rootObject[tracknum]["source"].ToString();
   });
于 2012-10-31T03:54:46.553 回答
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当调用控件的方法时,或者当您需要一个简单的委托但不想自己定义一个委托时,可以使用此委托。

谢谢,
我希望你觉得这有帮助:)

于 2012-10-31T03:57:16.597 回答