抽象的模式注意到涉及BackgroundWorker

Voo*_*ild 1 c# backgroundworker

在我的课程中,我注意到下面的模式.我怎么能把它抽象出来呢?有什么建议?

private void InitializeClass()
{
    BackgroundWorker bgw1 = new BackgroundWorker();
    bgw1.DoWork += (s,e) =>
    {
        // doing work
    };

    BackgroundWorker bgw2 = new BackgroundWorker();
    bgw2.DoWork += (s,e) =>
    {
        // doing work
    };

    BackgroundWorker bgw3 = new BackgroundWorker();
    bgw3.DoWork += (s,e) =>
    {
        // doing work
    };

    bgw1.RunWorkerAsync();
    bgw2.RunWorkerAsync();
    bgw3.RunWorkerAsync();
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 6

public static class Worker
{
    public static void Execute(params DoWorkEventHandler[] handlers)
    {
        foreach (DoWorkEventHandler handler in handlers)
        {
            BackgroundWorker worker = new BackgroundWorker();
            DoWorkEventHandler capturedHandler = handler;

            worker.DoWork += (sender, e) =>
            {
                try
                {
                    capturedHandler(sender, e);
                }
                finally
                {
                    worker.Dispose();    
                }
            };

            worker.RunWorkerAsync();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

Worker.Execute((s, e) =>
{
    // doing work
});
Run Code Online (Sandbox Code Playgroud)

或者如果您想安排多个活动:

Worker.Execute(
    (s, e) => 
    {
        // doing work
    },
    (s, e) => 
    {
        // doing work
    },
    (s, e) => 
    {
        // doing work
    }
);
Run Code Online (Sandbox Code Playgroud)

更新:

这是一个允许您指定已完成的处理程序的替代方法:

public class Worker
{
    public Worker Work(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler complete)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += doWork;
        worker.RunWorkerCompleted += complete; 
        worker.RunWorkerAsync();
        return this;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后:

new Worker()
    .Work((s, e) => { /** some work **/ }, (s, e) => { /** work completed **/ })
    .Work((s, e) => { /** some work **/ }, (s, e) => { /** work completed **/ })
    .Work((s, e) => { /** some work **/ }, (s, e) => { /** work completed **/ });
Run Code Online (Sandbox Code Playgroud)

  • 嗯,我喜欢这个主意.出于兴趣,你将如何处理对工人的处置? (2认同)