2011-05-14 109 views
3

我正在对一个简单的应用程序进展缓慢:它创建一个请求,填写标题并为我提取一个网页。我想出的是,为了更新UI(一按钮已被按下之后)我必须使用调度像这样:如何在工作线程中从UI线程获取变量?

Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new delegate_onearg_s(UpdateStatus), "Sending Request..."); 

在其设定我label_Status =消息这种情况下我有一个UpdateStatus(字符串消息);

到目前为止这么好。现在我希望它首先从文本框中获取输入,然后将其转换为稍后用于创建请求的URL,但我该怎么做?我试过这个:

string url = Convert.ToString(Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new delegate_string_get(GetInput))); 

GetInput()在这种情况下简单地返回textBox.Text; 这实际上并不奏效 - 它会返回一些与调度程序相关的通用事物。

如何从UI线程中的文本框获取变量并将其与调度程序的工作线程进行比较?

Merci beacoup :)

PS。我不知道自己在做什么的概率很高。回答时请记住这一点。

回答

1

你在正确的轨道上,但你需要使用Invoke,而不是BeginInvokeBeginInvoke在调度程序线程上异步执行委托,但您需要同步获取结果。

string url = (string)Dispatcher.Invoke(new Func<string>(GetInput)); 
+0

工作。托马斯:你是个很酷的人 – 2011-05-15 01:31:26

0

在启动线程之前,声明一个字符串变量并为其赋予textBox的值,然后在GetInput方法中使用该变量。

string myVal = myTextBox.Text; 

... 在您的GetInput中使用它。

+0

如果应用程序启动时所有字段都为空,按下按钮后工作完成,那么字符串需要在按下按钮后分配值,而不是之前,我错了吗?所以在这种情况下,我真的不能对字符串做任何事情,直到我按下按钮,在这种情况下,我被捆绑在由按下按钮创建的线程中。 – 2011-05-15 00:50:58