передающие параметры к потоку

Я хочу передать функцию, которая берет параметр Конструктору ThreadStart в C#. Но, кажется, что это не возможно, поскольку я получаю синтаксическую ошибку это, я пытаюсь сделать что-то вроде этого

Thread t1 = new Thread(new ThreadStart(func1(obj1));

где obj1 является объектом типа List<string> (сказать).

Если я хочу, чтобы поток выполнил эту функцию, которая берет в объекте в качестве параметра, и я планирую создать 2 таких потока одновременно с различными значениями параметров, что лучший метод должен достигнуть этого?

6
задан abelenky 11 May 2010 в 19:11
поделиться

9 ответов

Вам нужен ParametrizedThreadStart для передачи параметра потоку.

Thread t1 = new Thread(new ParametrizedThreadStart(func1);
t1.Start(obj1);
8
ответ дан 8 December 2019 в 02:24
поделиться

Если вы используете .NET 3.5 или выше, один вариант - использовать для этого лямбду:

var myThread = new System.Threading.Thread(() => func1(obj1)); 
13
ответ дан 8 December 2019 в 02:24
поделиться

Попробуйте следующее:

var bar = 0.0;
Thread t = new Thread(() => 
    {
        Foo(bar);
    });
t.IsBackground = true;
t.Start();

Или в вашем случае:

Object obj1 = new Object();
Thread t = new Thread(() => 
    {
        func1(obj1);
    });
t.IsBackground = true;
t.Start();
3
ответ дан 8 December 2019 в 02:24
поделиться

Это тот эффект, который вы ищете?

        static void Main(string[] args)
    {
        var list = new List<string>(){
            "a","b","c"
        };

        Thread t1 = new Thread(new ParameterizedThreadStart(DoWork));

        t1.Start(list);

        Console.ReadLine();

    }

    public static void DoWork(object stuff)
    {
        foreach (var item in stuff as List<string>)
        {
            Console.WriteLine(item);
        }
    }
3
ответ дан 8 December 2019 в 02:24
поделиться
0
ответ дан 8 December 2019 в 02:24
поделиться

Вам абсолютно необходимо использовать объект Thread ? Или вы просто хотите, чтобы произошла многопоточная обработка? Более «современный» подход заключался бы в использовании асинхронного делегата как такового:

private delegate void FuncDelegate(object obj1);
.
.
.
FuncDelegate func = func1;
IAsyncResult result = func.BeginInvoke(obj1, Completed, func);

// do other stuff
.
.
.

private void Completed(IAsyncResult result)
{
    ((FuncDelegate)result.AsyncState).EndInvoke(result);

    // do other cleanup
}

Еще более «современным» методом было бы использование задач в .NET 4 TPL.

0
ответ дан 8 December 2019 в 02:24
поделиться

Вы можете начать новый поток следующим образом:

Thread thread = new Thread(delegate() {
    // Code here.
});
thread.Start();

Внутри анонимного метода у вас есть доступ к переменным, которые были в области видимости, когда был создан делегат.

7
ответ дан 8 December 2019 в 02:24
поделиться

Edit Assassin не смог заставить этот код работать, поэтому я включил полный пример консольного приложения в конце этого поста.



{ // some code
  Thread t1 = new Thread(MyThreadStart);
  t1.Start(theList);
}

void MyThreadStart(object state)
{
  List<string> theList = (List<string>)state;
  //..
}


Это мое редактирование: Ниже представлено полное консольное приложение - метод действительно работает:


using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Threading.Thread t = new System.Threading.Thread(MyThreadStart);
            t.Start("Hello");
            System.Console.ReadLine();
        }


        static void MyThreadStart(object state)
        {
            System.Console.WriteLine((string)state);
        }
    }
}


3
ответ дан 8 December 2019 в 02:24
поделиться
static void func1(object parameter)
{
   // Do stuff here.
}

static void Main(string[] args)
{
  List<string> obj1 = new List<string>();
  Thread t1 = new Thread(func1);
  t1.Start(obj1);
}

Он использует нового делегата в .Net 2.0 под названием ParameterizedThreadStart. Вы можете прочитать об этом здесь .

1
ответ дан 8 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: