c#中的线程问题

本文关键字:问题 线程 | 更新日期: 2023-09-27 18:18:21

我有一段代码,它运行一个方法,然后使用不同的参数再次运行相同的方法。这种方法大约需要45秒来完成,所以总共大约需要一分半钟。它看起来像:

//start
DbInfoPackage migratedData = runfirstqueries(connectSQLServer, log);
DbInfoPackage nonMigratedData = runfirstqueries(connectOracle, log);
//end

是否可以使用线程同时运行方法?

c#中的线程问题

是的,使用多线程可以同时运行两个方法。

如果你想知道如何,查看…

  • …静态ThreadPool.QueueUserWorkItem方法:

    //using System.Threading;
    DbInfoPackage migratedData = null;
    DbInfoPackage nonMigratedData = null;
    ThreadPool.QueueUserWorkItem(_ => { migratedData = …; });
    ThreadPool.QueueUserWorkItem(_ => { nonMigratedData = …; });
    

    计算两个工作项何时完成将是一项小工作。如果你的目标是至少版本4的。net框架,你可以使生活更简单的…

  • …高级任务并行库(TPL):

    //using System.Threading.Tasks;
    DbInfoPackage migratedData = null;
    DbInfoPackage nonMigratedData = null;
    Task firstTask = Task.Run(() => { migratedData = …; });
    Task secondTask = Task.Run(() => { nonMigratedData = …; });
    …
    Task.WaitAll(firstTask, secondTask);
    

    (我不是很了解TPL,所以这个代码示例可能不是最佳的)

  • 新的语言关键字async/await建立在TPL之上,使代码更易于阅读。(我没有准备好的例子,因为我通常不使用。net Framework 4.5/Visual Studio 2012。)

既然人们给出了更低层次的答案,使用System.Threading.Thread和诸如此类的东西,这就是我要做的:

Task<DbInfoPackage> migratedDataTask = Task.Run<DbInfoPackage>(() => runfirstqueries(connectSQLServer, log));
Task<DbInfoPackage> nonMigratedDataTask = Task.Run<DbInfoPackage>(() => runfirstqueries(connectOracle, log));
Task.WaitAll(migratedDataTask, nonMigratedDataTask);
var migratedData = migratedDataTask.Result;
var nonMigratedData = nonMigratedDataTask.Result;

将在两个并发任务中运行它们,等待它们都完成,并获取结果。您需要添加一些错误处理,但这很容易。

如果您可以将其工作到您的工作流中(希望您可以),使用await Task.WhenAll(migratedDataTask, nonMigratedDataTask)而不是WaitAll要好得多,但我在本例中使用后者来维持您的线程阻塞行为。

C#中的多线程可以按照本教程中的描述完成;例如,使用这里记录的Thread类。然而,从你的代码中并不清楚多线程是否真的可以消除性能瓶颈。