首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从其他方法或异步访问textbox

从其他方法或异步访问textbox
EN

Stack Overflow用户
提问于 2012-10-31 11:46:15
回答 2查看 1.2K关注 0票数 3

我对C#比较陌生,在异步方法中检索textbox值时遇到了一些问题。我使用线程来检索UI中的文本输入并在代码中使用它。VS2010接受我的代码,但当我开始调试时,它给了我以下异常Invalid cross-thread access。想法?我是不是遗漏了什么?

代码语言:javascript
复制
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平台上执行此操作

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-31 11:54:47

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

代码语言:javascript
复制
string tracknum = (string)trackid.Invoke(new Func<string>(() => trackid.Text));

编辑:

在Windows Phone上:

代码语言:javascript
复制
string tracknum = string.Empty;
Deployment.Current.Dispatcher.BeginInvoke(() =>
   {
       tracknum = trackid.Text;
       string source = rootObject[tracknum]["source"].ToString();
   });
票数 1
EN

Stack Overflow用户

发布于 2012-10-31 11:57:17

您将收到此类异常,因为您试图从创建对象的线程之外的其他线程访问对象(尝试异步访问该线程)。

为了解决这个问题,我们需要在拥有控件底层窗口句柄的线程上执行一个委托。在这种情况下,我们可以使用Invoke(Delegate method)

示例

代码语言:javascript
复制
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方法时,或者需要简单的委托但不想自己定义时,可以使用此委托。

谢谢,

我希望这对您有帮助:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13150979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档