我正在使用以下示例。
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用于循环。并且移动到第一个循环。来自第一个的值的值第二个循环可能不一样。
答案 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;
添加到您的代码中。