C# 在线程执行后调用委托
我需要调用一个可能需要3分钟以上时间才能运行的SQL命令 显然,我不只是想打电话等它结束 我想做的是创建一个线程并在其中执行它 我也不想使用“we we there yet?”方法,而是更希望线程在其已完成的调用线程中调用委托 所以我把它作为主线C# 在线程执行后调用委托,c#,multithreading,C#,Multithreading,我需要调用一个可能需要3分钟以上时间才能运行的SQL命令 显然,我不只是想打电话等它结束 我想做的是创建一个线程并在其中执行它 我也不想使用“we we there yet?”方法,而是更希望线程在其已完成的调用线程中调用委托 所以我把它作为主线 public Thread Process() { worker = new Worker { date = date, dc = dc, despatchProcess = despatchProcess }; workerThrea
public Thread Process()
{
worker = new Worker { date = date, dc = dc, despatchProcess = despatchProcess };
workerThread = new Thread(worker.process);
workerThread.Start();
return workerThread;
}
所以在worker内部,我希望它调用这个主线程中的一个委托
实现这一点的最佳方法是什么?最好的选择是使用
任务,而不是线程。然后,您可以在任务上添加一个延续(或新的async
/wait
语法),以便在任务完成时运行代码
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());
我认为您需要使用async
和wait
高级文档在这里;我将尝试找到一些简单的例子,因为这只是太多的信息
编辑:
这是一个更好的例子;
基本上,您只需要指定您的委托await
的sql调用方法。如果您使用的是足够新的.NET版本,那么使用Task
和async/await
的其他答案都是非常好的选择。否则,我可能会选择一个你可以收听“RunWorkerCompleted”事件并有选择地处理取消的问题。如果这是一个合法的问题Async/Wait需要C#5在VS 2012上,请不要建议需要最新技术的解决方案,除非添加警告,否则,它会浪费人们使用早期版本的时间。