线程执行后调用委托

时间:2013-05-28 23:16:51

标签: c# multithreading

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

显然,我不只是想打电话等待它完成。

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

我也不想使用“我们还在吗?”方法,并希望线程在调用线程中调用它已完成的委托。

所以我把它作为主线程;

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

所以在worker里面我希望它在这个主线程中调用一个委托。

实施此方法的最佳方法是什么?

3 个答案:

答案 0 :(得分:7)

最好的选择是使用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());

答案 1 :(得分:0)

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

编辑:

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

答案 2 :(得分:0)

如果您使用的是最新版本的.NET,那么使用Taskasync/await的其他答案都是非常不错的选择。否则我可能会使用BackgroundWorker,您可以在其中收听“RunWorkerCompleted”事件并选择处理取消。