线程问题
本文关键字:问题 线程 | 更新日期: 2023-09-27 18:08:12
我第一次尝试在应用程序中使用线程,但是在我尝试实例化我的线程的行上,我得到了错误'方法名称预期'。下面是我的代码:
private static List<Field.Info> FromDatabase(this Int32 _campId)
{
List<Field.Info> lstFields = new List<Field.Info>();
Field.List.Response response = new Field.List.Ticket
{
campId = _campId
}.Commit();
if (response.status == Field.List.Status.success)
{
lstFields = response.fields;
lock (campIdLock)
{
loadedCampIds.Add(_campId);
}
}
if (response.status == Field.List.Status.retry)
{
Thread th1 = new Thread(new ThreadStart(FromDatabase(_campId)));
th1.Start();
}
return lstFields;
}
ThreadStart构造函数只接受方法名。你在执行这个方法。改成Thread th1 = new Thread(new ThreadStart(FromDatabase));
然而,这将是不正确的,因为FromDatabase方法似乎正在接受参数,而ThreadStart期望方法没有参数,所以你应该使用ParameterizedThreadStart
阅读以下文章了解更多细节:http://www.dotnetperls.com/parameterizedthreadstart
你不是在创建一个委托,你实际上是在调用FromDatabase方法。
正确的解决方案是使用参数化的线程启动试试这个,你需要修改FromDatabase的签名:private static List<Field.Info> FromDatabase(this Int32 _campId)
{
List<Field.Info> lstFields = new List<Field.Info>();
Field.List.Response response = new Field.List.Ticket
{
campId = _campId
}.Commit();
if (response.status == Field.List.Status.success)
{
lstFields = response.fields;
lock (campIdLock)
{
loadedCampIds.Add(_campId);
}
}
if (response.status == Field.List.Status.retry)
{
Thread th1 = new Thread(new ParameterizedThreadStart(FromDatabase));
th1.Start(_campId);
}
return lstFields;
}
将方法签名更改为接受强制转换为int类型的对象。然后将调用更改为只包含方法名。比如下面的
private static List<Field.Info> FromDatabase(this object _campId)
{
int _campIdInt = (int)_campId;
List<Field.Info> lstFields = new List<Field.Info>();
Field.List.Response response = new Field.List.Ticket
{
campId = _campIdInt
}.Commit();
if (response.status == Field.List.Status.success)
{
lstFields = response.fields;
lock (campIdLock)
{
loadedCampIds.Add(_campIdInt);
}
}
if (response.status == Field.List.Status.retry)
{
Thread th1 = new Thread(FromDatabase);
th1.Start(_campIdInt);
}
return lstFields;
}
我倾向于像下面这样使用lambda表达式和闭包来启动带有参数的线程,而不是使用ParameterizedThreadStart
。
new Thread(() => FromDatabase(_campId)).Start();
有几个优点:
- 目标方法可以有多个参数。
- 这些参数可以是强类型的
ParameterizedThreadStart
只允许单个object
参数