线程创建
本文关键字:创建 线程 | 更新日期: 2023-09-27 18:25:39
请查看以下代码。我正在研究C#中的多线程。这个例子取自一些手册。在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();
}
}
这个问题纯粹是语法问题。当你写
MonitorMethodAccess.IncrementNumericField
此表达式的计算结果为方法本身。当你写
MonitorMethodAccess.IncrementNumericField()
此表达式的计算结果为方法调用的结果,在本例中为void
。不能将void
传递给线程,它需要一个方法或委托,以及一个不接受任何参数的方法或委托。现在的问题是如何实现传递一个方法和一些特定的参数?正如I4V所指出的,您可以将其封装在lambda表达式中,该表达式本身不接受参数:
Action methodInvocation = (Action)(() => MonitorMethodAccess.ModifyNumericField(12));
Thread bbb = new Thread(methodInvocation);
Thread bbb = new Thread(()=>MonitorMethodAccess.ModifyNumericField(12));
Thread ccc = new Thread(() => MonitorMethodAccess.ReadNumericField());
但是,如果您想像在第三个线程中那样从线程返回值,您应该考虑使用Tasks