2

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

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

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

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

所以我把它作为主线程;

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

所以在工作人员内部,我希望它在这个主线程中调用一个委托。

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

4

3 回答 3

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());
于 2013-05-28T23:19:14.543 回答
0

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

于 2013-05-28T23:28:16.093 回答
0

我认为您想使用async并且await高级文档在这里;http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx我会试着找一些简单的例子,因为这信息太多了。

编辑:

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

于 2013-05-28T23:20:59.350 回答