Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在线程执行后调用委托_C#_Multithreading - Fatal编程技术网

C# 在线程执行后调用委托

C# 在线程执行后调用委托,c#,multithreading,C#,Multithreading,我需要调用一个可能需要3分钟以上时间才能运行的SQL命令 显然,我不只是想打电话等它结束 我想做的是创建一个线程并在其中执行它 我也不想使用“we we there yet?”方法,而是更希望线程在其已完成的调用线程中调用委托 所以我把它作为主线 public Thread Process() { worker = new Worker { date = date, dc = dc, despatchProcess = despatchProcess }; workerThrea

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

显然,我不只是想打电话等它结束

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

我也不想使用“we 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内部,我希望它调用这个主线程中的一个委托


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

最好的选择是使用
任务,而不是线程。然后,您可以在任务上添加一个延续(或新的
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上,请不要建议需要最新技术的解决方案,除非添加警告,否则,它会浪费人们使用早期版本的时间。