参数化方法的后台工作线程

本文关键字:工作 线程 后台 方法 参数 | 更新日期: 2023-09-27 18:37:27

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

public bool fileMove(string file,string destinationPath)
{
}

参数化方法的后台工作线程

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

也就是说,假设您要问的是如何将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对象引用。

Backgroun worker 的工作方式如下,希望对您有所帮助。尝试是否适合您的需求:

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
}
您可以将

此方法用作后台工作线程的事件处理程序,但仍必须使用 worker 调用它。RunWorkerAsyn();

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

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