线程表现不正常,c#

时间:2015-08-24 03:34:47

标签: c# multithreading

我最近一直试图使用多线程来加速我的代码,但它并没有很好。

我正在开发的代码中有这个简单的逻辑:

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。

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;
    }
}