参数化方法的后台工作线程
本文关键字:工作 线程 后台 方法 参数 | 更新日期: 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));
像普通方法一样调用它将在同一线程上运行它