Существует перегрузка, которая принимает состояние объекта - однако, IMO, самый простой способ передать произвольные аргументы потоку запуска (и проверить подпись во время компиляции) с помощью анонимного метода:
int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
Просто (и это важно ) - * не меняйте a
или b
после этого, так как изменение будет отражено в потоке (как раса) - т.е. не сделать:
int a = ...
string b = ...
Thread t = new Thread (delegate() { SomeFunction(a,b);});
a = 12; // this change will be visible to the anonymous method - be careful ;-p
В случае циклов важно (при работе с асинхронными и захваченными переменными) вводить дополнительные переменные для этого; это очень разные
int[] data = {1,2,3,4,5};
foreach(int i in data) {
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(i); });
}
Console.ReadLine();
(который, вероятно, напечатает 5,5,5,5,5)
int[] data = {1,2,3,4,5};
foreach (int i in data) {
int tmp = i;
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(tmp); });
}
Console.ReadLine();
(который печатает 1-5 в произвольном порядке)
Обновление, чтобы обсудить точку зрения Миэ (комментарии); что означает этот отпечаток (99,999% времени - есть состояние гонки)?
string s = "dreams";
ThreadPool.QueueUserWorkItem(delegate {
Console.WriteLine(s);
});
s = "reality";
Console.ReadLine();