Passing a method to a backgroundworker dowork

前端 未结 3 1957
感动是毒
感动是毒 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 and call it...
        // Take the result from it and put it into e.Result
        _Worker.DoWork += (sender, e) => e.Result = ((Func)e.Argument)();
    
        // Take the e.Result and print it out
        // (cause we will always call a Func 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(() => 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 func)
    {
        _Worker.RunWorkerAsync(func);
    }
    
    private string DoSomething(int value)
    {
        return value.ToString("x");
    }
    
    private string AnotherTask()
    {
        return "Hello World";
    }
    

提交回复
热议问题