我最近一直试图使用多线程来加速我的代码,但它并没有很好。
我正在开发的代码中有这个简单的逻辑:
Start Main Code
{
//code
Thread thread1 = new Thread(() => {list1 = Method1();});
thread1.Start();
Thread thread2 = new Thread(() => {list2 = Method2();});
thread2.Start();
//more code
thread1.Join();
ListA = list1;
thread2.Join();
ListB = list2;
return whatever;
}
我希望thread1和thread2与主代码一起运行然后在Join()处遇到,但由于某种原因,我的代码全部跳转并且看似随机地返回到return语句,甚至没有通过整个主要代码。
这里有什么我想念的吗?
编辑:
我很抱歉在我的问题中不清楚。 我的意思是:
代码从第1行开始,正如预期的那样,然后正常运行,直到它符合我声明的Thread.Start()。然后它计算正常运行几行,直到它突然跳转到主代码块末尾的“返回任何”行。
我知道在调试这种代码时,它会跳过我创建的所有方法,这不是我面临的问题。正如我所提到的,问题是跳到代码末尾的蓝色跳跃。
我正在使用.NET Framework 4.5.1。
答案 0 :(得分:1)
由于您尚未指定.NET框架的哪个版本,因此我假设您可以使用异步框架。
如果需要,此代码将并行运行这两个任务,并且只需要与您拥有的最长任务一样长。 <{1}}代替Task.Delay()
,您可以使用自己的代码实际进入数据库并检索数据。
(运行https://dotnetfiddle.net/CCCfKw下面的代码版本)
using System;
using System.Linq;
using System.Collections.Generic;
using System.Threading.Tasks;
public class Program
{
public static void Main()
{
var doWork = new SomeWorkClass();
var list1Task = doWork.GetList1Async();
var list2Task = doWork.GetList2Async();
var list1 = list1Task.Result;
var list2 = list2Task.Result;
var newList = list1.Concat(list2).ToList();
foreach(var str in newList) {
Console.WriteLine(str);
}
}
}
public class SomeWorkClass
{
private List<string> _list1 = new List<string>() { "Some text 1", "Some other text 2" };
private List<string> _list2 = new List<string>() { "Yet more text 3" };
public async Task<List<string>> GetList1Async()
{
await Task.Delay(1000);
return _list1;
}
public async Task<List<string>> GetList2Async()
{
await Task.Delay(700);
return _list2;
}
}