线程问题

本文关键字:问题 线程 | 更新日期: 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参数