从另一个方法或Async访问文本框

时间:2012-10-31 03:46:15

标签: c# windows-phone-7 asynchronous

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

2 个答案:

答案 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方法时,或者当您需要一个简单的委托但不想自己定义一个委托时,可以使用此委托。

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