Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向后台工作人员发送参数?_C#_Backgroundworker - Fatal编程技术网

C# 向后台工作人员发送参数?

C# 向后台工作人员发送参数?,c#,backgroundworker,C#,Backgroundworker,假设我想向后台工作程序发送一个int参数,这是如何实现的 private void worker_DoWork(object sender, DoWorkEventArgs e) { } 我知道这是worker.RunWorkerAsync();,我不明白如何在worker工作中定义它应该采用int参数。您需要方法和属性 worker.RunWorkerAsync(5); private void worker_DoWork(object sender, DoWorkEventArgs e

假设我想向后台工作程序发送一个int参数,这是如何实现的

private void worker_DoWork(object sender, DoWorkEventArgs e) {

}
我知道这是worker.RunWorkerAsync();,我不明白如何在worker工作中定义它应该采用int参数。

您需要方法和属性

worker.RunWorkerAsync(5);

private void worker_DoWork(object sender, DoWorkEventArgs e) {
    int argument = (int)e.Argument; //5
}

您可以使用
dowworkeventargs.Argument
属性

worker.RunWorkerAsync(5);

private void worker_DoWork(object sender, DoWorkEventArgs e) {
    int argument = (int)e.Argument; //5
}
可以在Microsoft网站上找到完整示例(即使使用int参数):


    • 您可以这样开始:

      int value = 123;
      bgw1.RunWorkerAsync(argument: value);  // the int will be boxed
      
      Public (Class or Structure) MyPerson
                      public string FirstName { get; set; }
                      public string LastName { get; set; }
                      public string Address { get; set; }
                      public int ZipCode { get; set; }
      End Class
      
      然后

      private void worker_DoWork(object sender, DoWorkEventArgs e) 
      {
         int value = (int) e.Argument;   // the 'argument' parameter resurfaces here
      
         ...
      
         // and to transport a result back to the main thread
         double result = 0.1 * value;
         e.Result = result;
      }
      
      
      // the Completed handler should follow this pattern 
      // for Error and (optionally) Cancellation handling
      private void worker_Completed(object sender, RunWorkerCompletedEventArgs e) 
      {
        // check error, check cancel, then use result
        if (e.Error != null)
        {
           // handle the error
        }
        else if (e.Cancelled)
        {
           // handle cancellation
        }
        else
        {          
            double result = (double) e.Result;
            // use it on the UI thread
        }
        // general cleanup code, runs when there was an error or not.
      }
      
      请查看:


      尽管这是一个已经得到回答的问题,但我会留下另一个选项,IMO更容易阅读:

      BackgroundWorker worker = new BackgroundWorker();
      worker.DoWork += (obj, e) => WorkerDoWork(value, text);
      worker.RunWorkerAsync();
      
      在handler方法上:

      private void WorkerDoWork(int value, string text) {
          ...
      }
      

      您可以像这样传递多个参数

      List<object> arguments = new List<object>();
      arguments.Add("first");      //argument 1
      arguments.Add(new Object()); //argument 2
      // ...
      arguments.Add(10);           //argument n
      
      backgroundWorker.RunWorkerAsync(arguments);
      
      private void worker_DoWork(object sender, DoWorkEventArgs e) 
      {
        List<object> genericlist = e.Argument as List<object>;
        //extract your multiple arguments from 
        //this list and cast them and use them. 
      }
      
      List参数=新列表();
      参数。添加(“第一”)//论据1
      参数。添加(新对象())//论据2
      // ...
      增加(10)//论点
      backgroundWorker.RunWorkerAsync(参数);
      私有void worker_DoWork(对象发送方,DoWorkEventArgs e)
      {
      List genericlist=e.参数为List;
      //从中提取多个参数
      //此列表并强制转换它们并使用它们。
      }
      
      如果要传递多种类型的参数,可以尝试此方法,首先将它们全部添加到Object类型的数组中,然后将该对象传递给RunWorkerAsync(),例如:

         some_Method(){
         List<string> excludeList = new List<string>(); // list of strings
         string newPath ="some path";  // normal string
         Object[] args = {newPath,excludeList };
                  backgroundAnalyzer.RunWorkerAsync(args);
            }
      
      some_方法(){
      List excludeList=new List();//字符串列表
      string newPath=“某些路径”;//普通字符串
      对象[]args={newPath,excludeList};
      backgroundAnalyzer.RunWorkerAsync(args);
      }
      
      现在在后台工作人员的工作方法中

      backgroundAnalyzer_DoWork(object sender, DoWorkEventArgs e)
            {
              backgroundAnalyzer.ReportProgress(50);
              Object[] arg = e.Argument as Object[];
              string path= (string)arg[0];
              List<string> lst = (List<string>) arg[1];
              .......
              // do something......
              //.....
             }
      
      backgroundAnalyzer\u DoWork(对象发送方,DoWorkEventArgs e)
      {
      背景分析:报告进展(50);
      对象[]arg=e。参数作为对象[];
      字符串路径=(字符串)参数[0];
      List lst=(List)arg[1];
      .......
      //做点什么。。。。。。
      //.....
      }
      
      您应该始终尝试使用具有具体类型的复合对象(使用复合设计模式),而不是对象类型列表。谁会记得这些东西到底是什么?以后再考虑代码的维护。。。相反,请尝试以下方法:

      int value = 123;
      bgw1.RunWorkerAsync(argument: value);  // the int will be boxed
      
      Public (Class or Structure) MyPerson
                      public string FirstName { get; set; }
                      public string LastName { get; set; }
                      public string Address { get; set; }
                      public int ZipCode { get; set; }
      End Class
      
      然后:

      Dim person as new MyPerson With { .FirstName = “Joe”,
                                        .LastName = "Smith”,
                                        ...
                                       }
      backgroundWorker1.RunWorkerAsync(person)
      
      然后:

      private void backgroundWorker1_DoWork (object sender, DoWorkEventArgs e)
      {
              MyPerson person = e.Argument as MyPerson
              string firstname = person.FirstName;
              string lastname = person.LastName;
              int zipcode = person.ZipCode;                                 
      }
      

      我该如何处理两个参数?或者我该如何发送一个包含多个参数的对象?@soo:使用一个helper类或一个
      元组(C#4+)(编辑:是的,使用一个对象将其全部打包。例如,请参见DoWorkEventArgs self)。但是如何将结果通知UI?@rayray:
      label1.Text=e.result.ToString(),我在任何地方都把它标记为安全的。我不知道我的意思,我以为这是一个C#的东西。我在谷歌上搜索了“C#IMO”并在这里登陆,得到了答案…哈哈,3个参数怎么样?我从2012年起就不玩.NET了,但如果我没有弄错的话,你可以添加你想要的参数
      …=>工人工作(a、b、c)只要它匹配方法签名
      。。。WorkerDowWork(intA、stringB、stringC){…
      请记住,如果您使用此方法(就像我尝试的那样),每次都必须创建一个新的backgroundworker(在您的示例中您这样做了)。否则您将遇到与我一样的问题。我的backgroundworker将继续重复以前的运行。如果运行一次就可以了。它重复了两次上次运行和当前运行。第三次运行将重复最后两次和当前运行。等等。但是如何将值传递到RunWorkerAsync?@missReclusive转换“genericlist”项,即,让我们说“参数1”是int类型,然后是int argument1=(int)genericslist[0]这在维护方面是个坏主意。您应该使用具体类型而不是List,因为至少您可以了解自己在做什么(请参见下面回答中的一个示例)。我可能更喜欢
      Tuple
      (或专门类)而不是泛型对象列表+1。以这种方式发送参数还可以避免每次运行都必须启动新的backgroundworker以避免重复(至少在我的应用程序中)。请参阅下面与此问题相关的我的评论。此外,我的强制转换失败
      \u dirs=(string[])e.Argument;
      ,但此
      \u dirs=e.Argument为string[];
      函数。角色转换尝试转换到接口,代码符合…非常感谢!