3
A
回答
4
最简单的办法是捕捉到一个局部变量中关闭。
String text;
textBox.Invoke(() => text = textBox.Text);
编译器将生成一些代码,很像chibacity的溶液 - 局部变量变为编译器生成的类的字段。
UPDATE
这不起作用 - lambda表达式是不能分配给Delegate
。这个问题可以使用扩展方法来解决。
internal void ExecuteOnOwningThread(this Control control, Action action)
{
if (control.InvokeRequired)
{
control.Invoke(action);
}
else
{
action();
}
}
其用法如下。
String text;
textBox.ExecuteOnOwningThread(() => text = textBox.Text);
可以在lambda表达式中填充多个语句。
textBox.ExecuteOnOwningThread(() =>
{
DoStuff();
text = textBox.Text
DoOtherStuff();
});
但是,作为chibacity已经在评论中提到它可能会更好地明确写出一种方法。超出使用lambda表达式的某个点会对代码的可读性产生不利影响。使用lambda表达式当然很容易引入重复的代码。
0
您可以将委托传递给Invoke,该委派指向一个可以设置实例变量以保存文本值的方法,例如,
public Form1()
{
InitializeComponent();
Invoke(new Action(SetTextboxTextVariable));
}
private string _text;
private void SetTextboxTextVariable()
{
_text = txtBox.Text;
}
这涵盖了基本思想,同步和通知其他线程取决于你。 :)
更新
或者做一个步骤:
public Form1()
{
InitializeComponent();
string text = GetText();
}
private string GetText()
{
string text;
Invoke(new Action(text = txtBox.Text));
return text;
}
2
Control.Invoke()方法返回被调用方法的值。这使得很容易:
string value = (string)this.Invoke(new Func<string>(() => textBox1.Text));
还是有点更加明确:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
var dlg = new Func<string>(GetText);
string value = (string)this.Invoke(dlg);
}
private string GetText() {
return textBox1.Text;
}
相关问题
- 1. 如何从其他线程访问主UI线程中的System.Windows.Threading.Dispatcher?
- 2. WP7 - 访问UI线程?
- 3. 如何从UI线程访问工作线程?
- 4. 在nunit中访问UI线程
- 5. 访问窗体的UI线程?
- 6. 从后台线程访问UI对象
- 7. 多线程,访问UI控件
- 8. 如何从另一个线程同步UI和访问对象?
- 9. 如何从线程中访问System.Web.Http.Current.Response?
- 10. 如何从Java中的工作线程访问主线程?
- 11. UI线程vs后台线程 - UI控件可访问性边界
- 12. 从服务中访问UI线程处理程序
- 13. 从iOS中的其他线程访问UI组件
- 14. 跨线程访问wpf中的非ui对象
- 15. 如何访问线程内的类
- 16. c#如何访问我的线程?
- 17. 如何从ios中的CFRunLoopRun访问UI
- 18. 访问线程
- 19. 如何确定线程UI线程
- 20. 如何访问Spark Web UI?
- 21. Android中的UI线程如何工作?
- 22. 无法暂停线程访问UI Android中
- 23. 如何访问线程外的线程数据
- 24. 线程函数如何访问父线程的变量
- 25. 如何从多线程访问GUI(GTK)?
- 26. 如何从python线程访问数据
- 27. 为什么不能使用UI线程访问视图的线程?
- 28. 如何访问从UI中继承的类的UI元素viewController
- 29. 如何从工作线程更新UI线程中的视图
- 30. iOS:如何在主线程中更新UI的后台线程?
虽然具有一个班轮是可爱的,最终你会比例如设置变量做更多告诉另一个线程有一些数据准备好。有一个方法来填补这是进路。 – 2010-05-30 00:32:54
我绝对同意你 - 对于不重复多次的一个,两个或三个语句,我会考虑使用lambda表达式,但除此之外,使用单独的方法会产生更好的代码。 – 2010-05-30 00:54:52