请查看以下代码。 我在C#中了解MultiThreading。 这个例子来自一些手册。 在我的Main函数中,我尝试创建三个线程。
您能告诉我如何正确创建两个线程(有错误)吗? 谢谢!
using System;
using System.Threading;
public static class MonitorMethodAccess
{
private static int numericField = 1;
private static object syncObj = new object();
public static object SyncRoot
{
get { return syncObj; }
}
public static void IncrementNumericField()
{
if (Monitor.TryEnter(syncObj, 250))
{
try
{
++numericField;
}
finally
{
Monitor.Exit(syncObj);
}
}
}
public static void ModifyNumericField(int newValue)
{
if (Monitor.TryEnter(syncObj, 250))
{
try
{
numericField = newValue;
}
finally
{
Monitor.Exit(syncObj);
}
}
}
public static int ReadNumericField()
{
if (Monitor.TryEnter(syncObj, 250))
{
try
{
return (numericField);
}
finally
{
Monitor.Exit(syncObj);
}
}
return (-1);
}
}
class Program
{
static void Main(string[] args)
{
Thread aaa = new Thread(MonitorMethodAccess.IncrementNumericField);
Thread bbb = new Thread(MonitorMethodAccess.ModifyNumericField(12);//error
Thread ccc = new Thread(MonitorMethodAccess.ReadNumericField);//error
Console.ReadKey();
}
}
答案 0 :(得分:2)
问题纯粹是语法上的。当你写
MonitorMethodAccess.IncrementNumericField
此表达式计算方法本身。当你写
MonitorMethodAccess.IncrementNumericField()
此表达式求值为调用方法的结果,在本例中为void
。你不能将void
传递给一个线程,它需要一个方法或一个委托,一个不接受任何参数的方法。现在问题是如何实现传递方法和一些特定参数?正如I4V所指出的,你可以将它包装在一个lambda表达式中,该表达式本身不带参数:
Action methodInvocation = (Action)(() => MonitorMethodAccess.ModifyNumericField(12));
Thread bbb = new Thread(methodInvocation);
答案 1 :(得分:1)
Thread bbb = new Thread(()=>MonitorMethodAccess.ModifyNumericField(12));
Thread ccc = new Thread(() => MonitorMethodAccess.ReadNumericField());
但是如果你想在第三个帖子中返回线程中的值,你应该考虑使用Tasks