如何在C#中为以下方法添加后台工作程序。
public bool fileMove(string file,string destinationPath)
{
}
答案 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));
像普通方法一样调用它将在同一个线程上运行它