参数化方法的背景工作者

时间:2015-01-13 06:03:16

标签: c#

如何在C#中为以下方法添加后台工作程序。

public bool fileMove(string file,string destinationPath)
{

}

3 个答案:

答案 0 :(得分:2)

您可能需要考虑详细说明您的问题。它不是很清楚。

那就是说,假设你要问的是如何运行filemove(string, string)方法作为BackgroundWorker.DoWork事件的入口点,你有几个选择。

我的偏好是提供一个匿名方法作为实际的事件处理程序,并利用变量捕获来提供实际参数。例如:

void StartBackgroundWorker(string file, string destinationPath)
{
    BackgroundWorker bw = new BackgroundWorker();

    bw.DoWork += (sender, e) => filemove(file, destinationPath);
    bw.RunWorkerAsync();
}

通过这种方式,BackgroundWorker获取与所需签名匹配的事件处理程序,您仍然可以在不更改其签名的情况下调用方法。

如果出于某种原因需要访问方法中的BackgroundWorker对象,那么必须更改方法的签名,以便可以传递引用。但你仍然可以将其与上述方法混合使用:

void StartBackgroundWorker(string file, string destinationPath)
{
    BackgroundWorker bw = new BackgroundWorker();

    bw.DoWork += (sender, e) => filemove(file, destinationPath, bw);
    bw.RunWorkerAsync();
}

如果你想完全避免变量捕获(但为什么?),它仍然可以完成。但在这种情况下,您需要将所需的值传递给RunWorkerAsync()方法。例如:

void StartBackgroundWorker(string file, string destinationPath)
{
    BackgroundWorker bw = new BackgroundWorker();

    bw.DoWork += (sender, e) =>
    {
        Tuple<string, string> args = (Tuple<string, string>)e.Argument;

        filemove(args.Item1, args.Item2);
    };
    bw.RunWorkerAsync(Tuple.Create(file, destinationPath));
}

当然,如果需要,您可以使用上面的Tuple<string, string, BackgroundWorker>来传递BackgroundWorker对象引用。

答案 1 :(得分:0)

Backgroun工作如下,我希望它会有所帮助。尝试它是否符合您的需求:

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.RunWorkerAsync();

worker_DoWork如下:

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    //Write your logic here. For example call your method
}

答案 2 :(得分:0)

您可以将此方法用作后台工作程序的事件处理程序,但仍需要使用worker.RunWorkerAsyn();

进行调用
 worker.DoWork += new DoWorkEventHandler((s, ex) => filemove(file,destination));

像普通方法一样调用它将在同一个线程上运行它