我是第一次尝试在应用程序中使用线程,但是在我尝试实例化我的线程的行上,我得到错误'方法名称'。这是我的代码:
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;
}
答案 0 :(得分:11)
ThreadStart构造函数只接受方法名称。你正在那里执行方法。
将其更改为Thread th1 = new Thread(new ThreadStart(FromDatabase));
然而这是不正确的,因为FromDatabase方法似乎是参数,而ThreadStart期望方法没有参数所以你应该使用ParameterizedThreadStart
阅读以下文章了解更多详情:http://www.dotnetperls.com/parameterizedthreadstart
答案 1 :(得分:1)
您没有创建委托,实际上是在调用FromDatabase方法。
正确的解决方案是使用parameterized thread start 试试这个,你需要改变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;
}
答案 2 :(得分:1)
更改方法签名以获取您转换为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;
}
答案 3 :(得分:0)
我倾向于使用lambda表达式和闭包(如下所示)来启动带参数的线程,而不是使用ParameterizedThreadStart
。
new Thread(() => FromDatabase(_campId)).Start();
有几个优点:
ParameterizedThreadStart
只允许使用一个object
参数。