【问题标题】:Textbox text from background worker?来自后台工作人员的文本框文本?
【发布时间】:2013-07-12 20:34:50
【问题描述】:

我一直在试图弄清楚如何从后台工作人员中获取我的文本框的文本或其他属性。有人知道怎么做这个吗?我不能将它作为参数传递,因为它需要是实时的。感谢您的帮助!

【问题讨论】:

  • 为什么您当前的代码不起作用?你有例外吗?如果有,是什么样的?
  • 您所说的“从背景中”是什么意思?
  • @Adrian 道歉,我的意思是“来自后台工作人员”。 @svick 在我当前的代码中,我传递了文本,但是当它到达使用文本的代码部分时,文本已经过时了。所以我需要在后台工作人员中使用它的确切时刻获取文本。希望这是有道理的。

标签: c# winforms backgroundworker


【解决方案1】:

我认为您只需要调用该属性(伪代码):

private void bgw1_DoWork(object sender, DoWorkEventArgs e)
{
  // looping through stuff
  {
    this.Invoke(new MethodInvoker(delegate { Text = textBox1.Text; }));
  }
}

【讨论】:

  • 谢谢.. 我不知道它这么简单。
  • 我被压制了,您没有提到异常跨线程操作无效:控件从创建它的线程以外的线程访问。 在您的问题中..
【解决方案2】:

使用后台工作者的ReportProgress 方法和事件。这将为您切换到正确的线程。

【讨论】:

    【解决方案3】:

    或者如果 WPF 中需要:

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

    【讨论】:

      【解决方案4】:

      我认为你应该使用调用方法。

      这是我的例子。

      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中,我操作了一些文本文件,并告知用户到目前为止我已经处理了多少个文件。

      【讨论】:

      • 将“displayFNums”替换为您的实际方法名称“writeToTextbox”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      相关资源
      最近更新 更多