我在UI控件上使用BeginInvoke
等方法执行操作没有问题,但这是一个void
方法。我需要从文本框中获取值以在不同的线程中使用。
我该如何实现这一点?
我在UI控件上使用BeginInvoke
等方法执行操作没有问题,但这是一个void
方法。我需要从文本框中获取值以在不同的线程中使用。
我该如何实现这一点?
String text;
textBox.Invoke(() => text = textBox.Text);
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表达式很容易引入重复的代码。
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;
}
您可以传递一个委托到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;
}