У меня есть пример приложения, и мне интересно, может ли кто-нибудь пролить свет на это. Когда я ставлю точку останова в цикле for на шаг к коду в отладчике, почему он переключается с одного потока на другой? это происходит при запуске приложения во время выполнения... См. код ниже:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TPLSample
{
class Program
{
static void Main(string[] args)
{
Management m = new Management();
Task a = new Task(() => m.Operation1());
a.Start();
Task b = new Task(() => m.Operation2());
b.Start();
Console.ReadLine();
}
}
public class Management
{
A a = null;
B b = null;
public void Operation1()
{
a = new A();
}
public void Operation2()
{
b = new B();
}
}
public class A
{ Client a = new Client();
public A()
{
while (true)
{
a.Test("Im AAAAA");
}
}
}
public class B
{
Client a = new Client();
public B()
{
while (true)
{
a.Test("Im BBBBB");
}
}
}
public class Client
{
Object ibj = new Object();
public void Test(string item)
{
lock (ibj)
{
for (int i = 0; i < 200000; i++)
{
Console.WriteLine(item);
}
}
}
}
}
В результате получается смесь As и Bs. Разве блокировка не должна блокировать поток, чтобы результат был упорядочен? То же самое происходит в приложении, которое я пишу, за исключением того, что циклы WHILE выполняются вечно (каждая задача должна постоянно опрашиваться). Обратите внимание, что я запускаю две задачи, потому что я не хочу, чтобы один цикл WHILE препятствовал запуску другого, если цикл WHILE должен выполняться вечно. Как мне заставить их последовательно переходить к этой функции в классе CLIENT?