线程问题

时间:2011-09-12 07:18:16

标签: c# multithreading

我是第一次尝试在应用程序中使用线程,但是在我尝试实例化我的线程的行上,我得到错误'方法名称'。这是我的代码:

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;
    }

4 个答案:

答案 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参数。