c#中的线程问题
本文关键字:问题 线程 | 更新日期: 2023-09-27 18:18:21
我有一段代码,它运行一个方法,然后使用不同的参数再次运行相同的方法。这种方法大约需要45秒来完成,所以总共大约需要一分半钟。它看起来像:
//start
DbInfoPackage migratedData = runfirstqueries(connectSQLServer, log);
DbInfoPackage nonMigratedData = runfirstqueries(connectOracle, log);
//end
是否可以使用线程同时运行方法?
是的,使用多线程可以同时运行两个方法。
如果你想知道如何,查看…
-
…静态
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
类。然而,从你的代码中并不清楚多线程是否真的可以消除性能瓶颈。