【发布时间】:2012-09-14 17:23:24
【问题描述】:
我正在尝试理解 .Net 中的线程概念。 我无法使用 Yield() 方法。当我被 10 整除时,我希望控件转到并行线程。
请帮忙。
下面是我的示例代码:
class ThreadTest
{
//Index i is declared as static so that both the threads have only one copy
static int i;
static void Main(string[] args)
{
Thread t = new Thread(WriteY);
i = 0;
//Start thread Y
t.Start();
//Do something on the main thread.
for (; i < 100; i++)
{
if (i % 10 == 0)
{
//Simulate Yield() function
Thread.Sleep(0);
Console.WriteLine("The X thread");
}
Console.Write(i + ":X ");
}
Console.ReadKey(true);
}
static void WriteY()
{
for (; i < 100; i++)
{
if (i % 10 == 0)
{
//Simulate Yield() function
Thread.Sleep(0);
Console.WriteLine("The Y thread");
}
Console.Write(i + ":Y ");
}
}
}
我得到编译时错误:
System.Threading.Thread 不包含“Yield”的定义
Tudor 回答。此方法仅适用于 .Net 4.0 及更高版本。
理想情况下,我希望一个线程启动并希望每个线程执行 10 个 i 递增。使用我目前的方法,我要么得到所有的“X”,要么得到所有的“Y”。
编辑: 使用 Tudor 和 TheHe 的输入 - 我已经能够获得交替的 X 和 Y。问题的症结在于锁定对象的使用。但是这段代码的输出是不可预测的。
【问题讨论】:
-
您说“行不通”——好吧,您期望会发生什么,您如何检查实际会发生什么?线程是各种复杂的,
Thread.Yield是一个令人难以置信微妙的东西,可以尝试观察。我已经完成了大量线程工作,而这不是一种我曾经需要使用的方法。退后一步:你能解释一下你想在这里做什么吗? -
Yield是一种 .NET 4.0+ 方法。你在运行那个版本吗? -
@Tudor,不。我正在使用 VS 2008 和 .Net 3.5。感谢您的澄清。
-
通过您的编辑,@Tudor 是完全正确的——您只是针对错误的框架版本。更新到 4.0 或 4.5;然而!我不认为这种方法会做你认为它会做的事情。
-
在低于 4.0 的 .NET 版本中,您可以根据需要在一定程度上模拟
Yield和Thread.Sleep(0),但无论如何,上面的代码不会真正起作用。
标签: c# .net multithreading