我需要调用一条可能需要 3 分钟以上才能运行的 SQL 命令。
很明显,我不只是想调用它并等待它完成。
我想做的是创建一个线程并在其中执行。
我也不想使用“Are we there yet?”方法,并且希望线程在它已完成的调用线程中调用委托(delegate)。
所以我把它作为主线程;
public Thread Process()
{
worker = new Worker { date = date, dc = dc, despatchProcess = despatchProcess };
workerThread = new Thread(worker.process);
workerThread.Start();
return workerThread;
}
所以在 worker 内部,我希望它在这个主线程中调用一个委托(delegate)。
实现它的最佳方法是什么?
最佳答案
最好的选择是使用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());
关于c# - 线程执行后调用委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16803046/