В С#, практически, я не заметил никакой разницы между следующим:
new Thread(SomeMethod).Start();
new Thread(new ParameterizedThreadStart(SomeMethod));
и
new Thread(new ThreadStart(SomeMethod));
В чем разница, если вообще есть?
В С#, практически, я не заметил никакой разницы между следующим:
new Thread(SomeMethod).Start();
new Thread(new ParameterizedThreadStart(SomeMethod));
и
new Thread(new ThreadStart(SomeMethod));
В чем разница, если вообще есть?
Конструктор Thread(ThreadStart) можно использовать только тогда, когда подпись вашего метода SomeMethod совпадает с делегатом ThreadStart. И наоборот, Thread(ParameterizedThreadStart) требует, чтобы SomeMethod соответствовал делегату ParameterizedThreadStart. Подписи ниже:
public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)
Конкретно, это означает, что вы должны использовать ThreadStart, когда ваш метод не принимает никаких параметров, и ParameterizedThreadStart, когда он принимает один параметр Object. Потоки, созданные с помощью первого, следует запускать с помощью вызова Start(), в то время как потоки, созданные с последним, должны указывать свой аргумент через Start(Object).
public static void Main(string[] args)
{
var threadA = new Thread(new ThreadStart(ExecuteA));
threadA.Start();
var threadB = new Thread(new ParameterizedThreadStart(ExecuteB));
threadB.Start("abc");
threadA.Join();
threadB.Join();
}
private static void ExecuteA()
{
Console.WriteLine("Executing parameterless thread!");
}
private static void ExecuteB(Object obj)
{
Console.WriteLine($"Executing thread with parameter \"{obj}\"!");
}
Наконец, вы можете вызывать конструкторы Thread без указания делегата ThreadStart или ParameterizedThreadStart. В этом случае компилятор сопоставит ваш метод с перегрузкой конструктора на основе своей сигнатуры, выполнив приведение неявно.
var threadA = new Thread(ExecuteA); // implicit cast to ThreadStart
threadA.Start();
var threadB = new Thread(ExecuteB); // implicit cast to ParameterizedThreadStart
threadB.Start("abc");
new Thread(SomeMethod) и new Thread(new ThreadStart(SomeMethod)):Разница между new Thread(SomeMethod) и new Thread(new ThreadStart(SomeMethod)) является чисто синтаксической: компилятор С# генерирует для них одинаковый код; первая версия является аббревиатурой последнего.
(Компилятор может автоматически вывести подходящий тип делегата для использования из подписей доступных конструкторов Thread и сигнатуры указанного метода SomeMethod. Выписывание new ThreadStart(…) вместо просто … является немного похоже на замену var фактическим типом некоторого выражения, вы избавляете компилятор от работы с фактическим типом.)
Эти две версии работают, когда SomeMethod не принимает никаких параметров, потому что подпись должна соответствовать делегату ThreadStart.
new Thread(new ParameterizedThreadStart(SomeMethod)):Разница между двумя выше и new Thread(new ParameterizedThreadStart(SomeMethod)) заключается в том, что этот вызов вызывает другой конструктор на Thread.
И что ParameterizedThreadStart запрещает другую подпись метода, чем ThreadStart: вашему SomeMethod необходимо принять один аргумент типа object, иначе он не будет соответствовать этому типу делегата.
Нет, но есть много раз, когда ваш код выглядит намного приятнее, если вы создаете объект ThreadStart в одном месте и запускаете новый поток в другом месте.