Я хочу передать функцию, которая берет параметр Конструктору ThreadStart в C#. Но, кажется, что это не возможно, поскольку я получаю синтаксическую ошибку это, я пытаюсь сделать что-то вроде этого
Thread t1 = new Thread(new ThreadStart(func1(obj1));
где obj1 является объектом типа List<string>
(сказать).
Если я хочу, чтобы поток выполнил эту функцию, которая берет в объекте в качестве параметра, и я планирую создать 2 таких потока одновременно с различными значениями параметров, что лучший метод должен достигнуть этого?
Вам нужен ParametrizedThreadStart
для передачи параметра потоку.
Thread t1 = new Thread(new ParametrizedThreadStart(func1);
t1.Start(obj1);
Если вы используете .NET 3.5 или выше, один вариант - использовать для этого лямбду:
var myThread = new System.Threading.Thread(() => func1(obj1));
Попробуйте следующее:
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();
Это тот эффект, который вы ищете?
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);
}
}
Вам абсолютно необходимо использовать объект 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.
Вы можете начать новый поток следующим образом:
Thread thread = new Thread(delegate() {
// Code here.
});
thread.Start();
Внутри анонимного метода у вас есть доступ к переменным, которые были в области видимости, когда был создан делегат.
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);
}
}
}
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. Вы можете прочитать об этом здесь .