C# - 循环不会停止(每次迭代都会启动新任务)
C# - Looping won't stop (each iteration starts new Task)
所以我有一个解决哲学家用餐问题的基本方法如下:
using System;
using System.Threading.Tasks;
namespace Conductor
{
class Program
{
private static object _locker = new object();
static void Main(string[] args)
{
object[] sticks = {new object(),
new object(),
new object(),
new object(),
new object()};
for (int i = 0; i<5; i++)
{
int next = (i + 1) % 5;
Task.Factory.StartNew(() => Eat(sticks[i], sticks[next], i));
}
}
static void Eat(object _leftChopstick, object _rightChopstick, int i)
{
lock (_locker)
{
lock (_leftChopstick)
{
lock (_rightChopstick)
{
Console.WriteLine("Eating" + i);
}
}
}
}
}
}
虽然它可能不是最有效的解决方案,但当 i 设置为 5 时,它会在 "StartNew" 调用中引发 IndexOutOfRange 异常。我无法弄清楚使用任务工厂如何以某种方式使我的程序被忽略for 循环条件。
如果我运行这个代码,没问题:
using System;
using System.Threading.Tasks;
namespace Conductor
{
class Program
{
private static object _locker = new object();
static void Main(string[] args)
{
object[] sticks = { new object(),
new object(),
new object(),
new object(),
new object()};
int i = 0;
Task.Factory.StartNew(() => Eat(sticks[i], sticks[i + 1], i));
Task.Factory.StartNew(() => Eat(sticks[i+1], sticks[i + 2], i + 1));
Task.Factory.StartNew(() => Eat(sticks[i+2], sticks[i + 3], i + 2));
Task.Factory.StartNew(() => Eat(sticks[i+3], sticks[i + 4], i + 3));
Task.Factory.StartNew(() => Eat(sticks[i + 4], sticks[0], i + 4));
Console.ReadLine();
}
static void Eat(object _leftChopstick, object _rightChopstick, int i)
{
lock (_locker)
{
lock (_leftChopstick)
{
lock (_rightChopstick)
{
Console.WriteLine("Eating" + i);
}
}
}
}
}
}
此外,如果我通过循环进行调试,我会得到同样的异常。
如有任何帮助,我们将不胜感激。抱歉,如果它太基础,或者如果我的代码中存在一些我遗漏的微不足道的缺陷。谢谢
for (int i = 0; i < 5; i++)
{
int j = i;
int next = (i + 1) % 5;
Task.Factory.StartNew(() => Eat(sticks[j], sticks[next], j));
}
所以我有一个解决哲学家用餐问题的基本方法如下:
using System;
using System.Threading.Tasks;
namespace Conductor
{
class Program
{
private static object _locker = new object();
static void Main(string[] args)
{
object[] sticks = {new object(),
new object(),
new object(),
new object(),
new object()};
for (int i = 0; i<5; i++)
{
int next = (i + 1) % 5;
Task.Factory.StartNew(() => Eat(sticks[i], sticks[next], i));
}
}
static void Eat(object _leftChopstick, object _rightChopstick, int i)
{
lock (_locker)
{
lock (_leftChopstick)
{
lock (_rightChopstick)
{
Console.WriteLine("Eating" + i);
}
}
}
}
}
}
虽然它可能不是最有效的解决方案,但当 i 设置为 5 时,它会在 "StartNew" 调用中引发 IndexOutOfRange 异常。我无法弄清楚使用任务工厂如何以某种方式使我的程序被忽略for 循环条件。
如果我运行这个代码,没问题:
using System;
using System.Threading.Tasks;
namespace Conductor
{
class Program
{
private static object _locker = new object();
static void Main(string[] args)
{
object[] sticks = { new object(),
new object(),
new object(),
new object(),
new object()};
int i = 0;
Task.Factory.StartNew(() => Eat(sticks[i], sticks[i + 1], i));
Task.Factory.StartNew(() => Eat(sticks[i+1], sticks[i + 2], i + 1));
Task.Factory.StartNew(() => Eat(sticks[i+2], sticks[i + 3], i + 2));
Task.Factory.StartNew(() => Eat(sticks[i+3], sticks[i + 4], i + 3));
Task.Factory.StartNew(() => Eat(sticks[i + 4], sticks[0], i + 4));
Console.ReadLine();
}
static void Eat(object _leftChopstick, object _rightChopstick, int i)
{
lock (_locker)
{
lock (_leftChopstick)
{
lock (_rightChopstick)
{
Console.WriteLine("Eating" + i);
}
}
}
}
}
}
此外,如果我通过循环进行调试,我会得到同样的异常。
如有任何帮助,我们将不胜感激。抱歉,如果它太基础,或者如果我的代码中存在一些我遗漏的微不足道的缺陷。谢谢
for (int i = 0; i < 5; i++)
{
int j = i;
int next = (i + 1) % 5;
Task.Factory.StartNew(() => Eat(sticks[j], sticks[next], j));
}