来自后台工作器的文本框文本?

5

我一直在尝试找出如何从后台工作器中获取我的文本框文本或其他属性。有人知道怎么做吗?我无法将它作为参数传递,因为它需要实时更新。感谢您的帮助!


1
为什么你现在的代码不起作用?你是否收到了异常?如果是,是什么类型的异常? - svick
你说的“from within a background”是什么意思? - Adriano Carneiro
@Adrian 抱歉,我是指“在后台工作器内部”。@svick 在我的当前代码中,我传递文本,但当它到达使用文本的代码部分时,文本已经过时了。因此,我需要在后台工作器内部获取文本的确切时刻。希望这有意义。 - user556396
https://dev59.com/_nVC5IYBdhLWcg3w7V33#142069 - Bolu
4个回答

9
我认为你只需要调用这个属性(伪代码):
private void bgw1_DoWork(object sender, DoWorkEventArgs e)
{
  // looping through stuff
  {
    this.Invoke(new MethodInvoker(delegate { Text = textBox1.Text; }));
  }
}

谢谢。我不知道它是那么简单的。 - user556396
5
抱歉,您的问题中没有提到异常情况“跨线程操作无效:从创建控件的线程以外的线程访问控件”。 - Bolu

2

或者如果需要在WPF中使用:

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
    string text = null;
    myTextBox.Dispatcher.Invoke(new Action(delegate()
    {
        text = myTextBox.Text;
    }));
}

2
使用BackgroundWorker的ReportProgress方法和事件。这将自动切换到正确的线程。

1

我觉得你应该使用调用方法。

这是我的示例。

delegate void myDelegate(string name);
//...
private void writeToTextbox(string fCounter)
{
    if (this.InvokeRequired)
    {
        myDelegate textWriter = new myDelegate(displayFNums);
        this.Invoke(textWriter, new object[] { fCounter });
    }
    else
    {
        textbox1.Text = "Processing file: " + fileCounter + "of" + 100;
    }
}
//...

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    //...
    writeToTextbox(fileCounter.ToString());
}

在dowork函数中,我会操作一些文本文件,并告知用户目前已经处理了多少个文件。

用你的实际方法名称 "writeToTextbox" 替换 "displayFNums" - dataCore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接