Passing a method to a backgroundworker dowork

前端 未结 3 1935
感动是毒
感动是毒 2021-01-14 11:50

In the code below, is there a way to instead of always subscribing the updateWorker_DoWork method, pass it a method like this

public void GetUpdates(SomeObje         


        
相关标签:
3条回答
  • 2021-01-14 11:59

    For your RunWorkerAsync() you can pass any argument you like. You can just put a Func() or Action() into it and in your DoWork() you just cast the object back to this specific type and call it.

    Examples are here and here.

    private void InitializeBackgroundWorker()
    {
        _Worker = new BackgroundWorker();
    
        // On a call cast the e.Argument to a Func<TResult> and call it...
        // Take the result from it and put it into e.Result
        _Worker.DoWork += (sender, e) => e.Result = ((Func<string>)e.Argument)();
    
        // Take the e.Result and print it out
        // (cause we will always call a Func<string> the e.Result must always be a string)
        _Worker.RunWorkerCompleted += (sender, e) =>
        {
            Debug.Print((string)e.Result);
        };
    }
    
    private void StartTheWorker()
    {
        int someValue = 42;
    
        //Take a method with a parameter and put it into another func with no parameter
        //This is called currying or binding
        StartTheWorker(new Func<string>(() => DoSomething(someValue)));
    
       while(_Worker.IsBusy)
           Thread.Sleep(1);
    
       //If your function exactly matches, just put it into the argument.
       StartTheWorker(AnotherTask);
    }
    
    private void StartTheWorker(Func<string> func)
    {
        _Worker.RunWorkerAsync(func);
    }
    
    private string DoSomething(int value)
    {
        return value.ToString("x");
    }
    
    private string AnotherTask()
    {
        return "Hello World";
    }
    
    0 讨论(0)
  • 2021-01-14 12:07

    Worked it out, was way simpler than I was thinking. Just had to make a delegate for the method called on DoWork. Probably should have phrased my original question better.

        public delegate void DoWorkDelegate(object sender,DoWorkEventArgs e);
    
         public void GetUpdates()
         {
             StartWorker(new DoWorkDelegate(updateWorker_DoWork));
         }
    
         public void StartWorker(DoWorkDelegate task)
         {
             //Set up worker
             updateWorker.WorkerReportsProgress = true;
             updateWorker.WorkerSupportsCancellation = true;
             updateWorker.DoWork += new DoWorkEventHandler(task);
             updateWorker.RunWorkerCompleted +=
                 new RunWorkerCompletedEventHandler(updateWorker_RunWorkerCompleted);
             updateWorker.ProgressChanged +=
                 new ProgressChangedEventHandler(updateWorker_ProgressChanged);
    
             //Run worker
             _canCancelWorker = true;
             updateWorker.RunWorkerAsync();
             //Initial Progress zero percent event
             _thes.UpdateProgress(0);
         }
    
          private void updateWorker_DoWork(object sender, DoWorkEventArgs e)
          {
              BackgroundWorker worker = sender as BackgroundWorker;
              e.Result = GetUpdatesTask(worker, e);
          }
    
    0 讨论(0)
  • 2021-01-14 12:11

    If I didn't misunderstand you, you need lambda expressions to construct anonymous method.

    updateWorker.DoWork += (sender,e)=>
      {
          //bla
      }
    

    Now you needn't always to write a method and pass it to new DoWorkEventHandler(myMethod)

    0 讨论(0)
提交回复
热议问题