如何在C#中实现多线程

时间:2018-05-28 07:09:06

标签: c# multithreading

我正在使用以下示例。

using System;
using System.Threading;

public class MyThread 
{

    public void Thread1() 
    {
        for (int i = 0; i < 10; i++) 
        {
            Console.WriteLine("Hello world " + i);
            Thread.Sleep(1000);
        }
    }
}

public class MyClass 
{

    public static void Main() 
    {
        Console.WriteLine("Before start thread");

        MyThread thr1 = new MyThread();
        MyThread thr2 = new MyThread();

        Thread tid1 = new Thread(new ThreadStart(thr1.Thread1) );
        Thread tid2 = new Thread(new ThreadStart(thr2.Thread1) );

        tid1.Start();
        tid2.Start();
    }
}

就像这样。

输出:

Before start thread
Hello world 0
Hello world 0
Hello world 1
Hello world 1
Hello world 2
Hello world 2
Hello world 3
Hello world 3
Hello world 4
Hello world 4
Hello world 5
Hello world 5
Hello world 6
Hello world 6
Hello world 7
Hello world 7
Hello world 8
Hello world 8
Hello world 9
Hello world 9

它从第一个for循环打印i并且睡眠1秒移动到第二个循环。它从第二个打开i循环睡眠1秒并移动到第一个。我不希望它在每次i打印后进行上下文切换。我想在打印一些i值之后的某段时间后想要这样,在该期间内打印一段时间{{1}从第二个循环开始。在过期之后再次移回第一个循环。

Ex:假设从第一个开始从1到2-10进行打印,并且睡眠移动到第二个,它可以从第二个开始打印1到2-10用于循环。并且移动到第一个循环。来自第一个的值的值第二个循环可能不一样。

2 个答案:

答案 0 :(得分:2)

你的意思是这样吗?

class Program
    {
        static void Main(string[] args)
        {
            Task.WaitAll
            (
               Task.Run(() => new Work().DoWork(1)),
               Task.Run(() => new Work().DoWork(2))
             );

            Console.ReadLine();
        }

        public class Work
        {
            public void DoWork(int taskNumber)
            {
                for(int i=0; i < 100; i++)
                {
                    Console.WriteLine("Task {0} Value {1}", taskNumber, i);
                }
            }
        }
    }

所以你得到以下输出

Task 1 Value 0
Task 1 Value 1
Task 1 Value 2
Task 1 Value 3
Task 1 Value 4
Task 1 Value 5
Task 1 Value 6
Task 1 Value 7
Task 1 Value 8
Task 1 Value 9
Task 1 Value 10
Task 1 Value 11
Task 1 Value 12
Task 2 Value 0
Task 2 Value 1
Task 2 Value 2
Task 2 Value 3
Task 2 Value 4
Task 2 Value 5
Task 2 Value 6
Task 2 Value 7
Task 2 Value 8
Task 2 Value 9
Task 2 Value 10
Task 2 Value 11
Task 2 Value 12
Task 2 Value 13
Task 2 Value 14
Task 2 Value 15
Task 2 Value 16
Task 2 Value 17
Task 2 Value 18
Task 2 Value 19
Task 2 Value 20
Task 2 Value 21
Task 2 Value 22
Task 2 Value 23
Task 2 Value 24
Task 2 Value 25
Task 2 Value 26
Task 2 Value 27
Task 2 Value 28
Task 2 Value 29
Task 2 Value 30
Task 2 Value 31
Task 2 Value 32
Task 2 Value 33
Task 2 Value 34
Task 2 Value 35
Task 2 Value 36
Task 1 Value 13
Task 1 Value 14
Task 1 Value 15
Task 1 Value 16
Task 1 Value 17
Task 1 Value 18
Task 1 Value 19
Task 1 Value 20
Task 1 Value 21
Task 1 Value 22
Task 1 Value 23
Task 1 Value 24
Task 1 Value 25
Task 1 Value 26
Task 1 Value 27
Task 1 Value 28
Task 1 Value 29
Task 1 Value 30
Task 1 Value 31
Task 1 Value 32
Task 1 Value 33
Task 2 Value 37
Task 2 Value 38
Task 2 Value 39
Task 2 Value 40
Task 2 Value 41
Task 2 Value 42
Task 2 Value 43
Task 2 Value 44
Task 2 Value 45
Task 2 Value 46
Task 2 Value 47
Task 2 Value 48
Task 2 Value 49
Task 2 Value 50
Task 2 Value 51
Task 2 Value 52
Task 2 Value 53
Task 2 Value 54
Task 2 Value 55
Task 1 Value 34
Task 1 Value 35
Task 1 Value 36
Task 1 Value 37
Task 1 Value 38
Task 1 Value 39
Task 1 Value 40
Task 1 Value 41
Task 1 Value 42
Task 1 Value 43
Task 1 Value 44
Task 1 Value 45
Task 1 Value 46
Task 1 Value 47
Task 1 Value 48
Task 2 Value 56
Task 2 Value 57
Task 2 Value 58
Task 2 Value 59
Task 2 Value 60
Task 2 Value 61
Task 2 Value 62
Task 2 Value 63
Task 2 Value 64
Task 2 Value 65
Task 2 Value 66
Task 2 Value 67
Task 2 Value 68
Task 2 Value 69
Task 2 Value 70
Task 2 Value 71
Task 2 Value 72
Task 2 Value 73
Task 2 Value 74
Task 2 Value 75
Task 2 Value 76
Task 1 Value 49
Task 1 Value 50
Task 1 Value 51
Task 1 Value 52
Task 1 Value 53
Task 1 Value 54
Task 1 Value 55
Task 1 Value 56
Task 1 Value 57
Task 1 Value 58
Task 1 Value 59
Task 1 Value 60
Task 1 Value 61
Task 1 Value 62
Task 1 Value 63
Task 1 Value 64
Task 1 Value 65
Task 1 Value 66
Task 1 Value 67
Task 1 Value 68
Task 1 Value 69
Task 2 Value 77
Task 2 Value 78
Task 2 Value 79
Task 2 Value 80
Task 2 Value 81
Task 2 Value 82
Task 2 Value 83
Task 2 Value 84
Task 2 Value 85
Task 2 Value 86
Task 2 Value 87
Task 2 Value 88
Task 2 Value 89
Task 2 Value 90
Task 2 Value 91
Task 2 Value 92
Task 2 Value 93
Task 2 Value 94
Task 2 Value 95
Task 2 Value 96
Task 2 Value 97
Task 2 Value 98
Task 2 Value 99
Task 1 Value 70
Task 1 Value 71
Task 1 Value 72
Task 1 Value 73
Task 1 Value 74
Task 1 Value 75
Task 1 Value 76
Task 1 Value 77
Task 1 Value 78
Task 1 Value 79
Task 1 Value 80
Task 1 Value 81
Task 1 Value 82
Task 1 Value 83
Task 1 Value 84
Task 1 Value 85
Task 1 Value 86
Task 1 Value 87
Task 1 Value 88
Task 1 Value 89
Task 1 Value 90
Task 1 Value 91
Task 1 Value 92
Task 1 Value 93
Task 1 Value 94
Task 1 Value 95
Task 1 Value 96
Task 1 Value 97
Task 1 Value 98
Task 1 Value 99

您的操作系统将为每个&#34;任务&#34;执行的时间,是等到他再次得到时间的时间。所以在这个时期,任务就是“睡觉”。

如果这对你有用,请告诉我。

答案 1 :(得分:0)

也许尝试使用Microsoft的Reactive Framework。它旨在做这种事情。

试试这段代码:

var source = Observable.Range(0, 10);
var interval = Observable.Interval(TimeSpan.FromSeconds(1.0));

var query =
    Observable
        .Merge(
            source.Select(n => $"A{n}").Buffer(3),
            source.Select(n => $"B{n}").Buffer(3))
        .SelectMany(x => x)
        .Zip(interval, (n, _) => n);

query.Subscribe(i => Console.WriteLine($"Hello world {i}"));

这是输出:

Hello world A0
Hello world A1
Hello world A2
Hello world B0
Hello world B1
Hello world B2
Hello world A3
Hello world A4
Hello world A5
Hello world B3
Hello world B4
Hello world B5
Hello world A6
Hello world A7
Hello world A8
Hello world B6
Hello world B7
Hello world B8
Hello world A9
Hello world B9

请注意3个批次"A""B"值的组?

每行在前一行后输出一秒。可以通过更改TimeSpan运算符中的Interval来更改。

这一切都发生在后台线程中(来自线程池),它允许你进行各种有趣的过滤,分组,查询,组合等。

Just NuGet&#34; System.Reactive&#34;并将using System.Reactive.Linq;添加到您的代码中。