在线程执行后调用委托

本文关键字:调用 线程 执行 | 更新日期: 2023-09-27 18:15:52

我需要调用一个可能需要3分钟以上才能运行的SQL命令。

显然我不想只是调用它然后等待它完成。

我想做的是创建一个线程并在其中执行它。

我也不想使用"Are we there yet?"方法,并且希望线程在调用线程中调用它已经完成的委托。

我把这个作为主线程;

public Thread Process()
{
    worker = new Worker { date = date, dc = dc, despatchProcess = despatchProcess };
    workerThread = new Thread(worker.process);
    workerThread.Start();
    return workerThread;
}

我想让worker在主线程中调用一个委托。

实现这一点的最佳方法是什么?

在线程执行后调用委托

最好的选择是使用Task,而不是线程。然后,您可以在任务(或新的async/await语法)上添加延续,以便在任务完成时运行代码。

public Task Process()
{
    worker = new Worker { date = date, dc = dc, despatchProcess = despatchProcess };
    return Task.Factory.StartNew( () => worker.process() );
}

调用者可以写:

Task work = Process();
work.ContinueWith(t => 
{
    // Run code here when work is done
});

如果您需要在此完成时运行的代码在主UI线程中运行,您可以使用:

work.ContinueWith(t => 
{
    // Run code here when work is done
}, TaskScheduler.FromCurrentSynchronizationContext());

我认为你想使用asyncawait,高级文档在这里;http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx我会找一些简单的例子因为信息量太大了。

编辑:

这是一个更好的例子;http://msdn.microsoft.com/en-us/library/vstudio/hh156528.aspx你基本上只需要指定你的委托await的方法进行sql调用。

如果您使用的是。net的最新版本,那么使用Taskasync/await的其他答案是非常好的选择。否则我可能会用一个BackgroundWorker,你可以听'RunWorkerCompleted'事件,并可选地处理取消。