Как передать параметры Thread.ThreadStart()
метода в C #?
Предположим, у меня есть метод под названием «скачать»
public void download(string filename)
{
// download code
}
Теперь я создал один поток в основном методе:
Thread thread = new Thread(new ThreadStart(download(filename));
ожидаемый тип ошибки
Как я могу передать параметры ThreadStart
целевому методу с параметрами?
c#
.net
multithreading
Свапнил гупта
источник
источник
Ответы:
Самое простое просто
Преимущество (преимущества) этого (пере
ParameterizedThreadStart
) состоит в том, что вы можете передавать несколько параметров, и вы получаете проверку во время компиляции, не требуя приведенияobject
все время.источник
new Thread(delegate() { download(filename); });
Посмотрите на этот пример:
Сначала вы создаете поток, передавая делегат в рабочий метод, а затем запускаете его с помощью метода Thread.Start, который принимает ваш объект в качестве параметра.
Так что в вашем случае вы должны использовать это так:
Но ваш метод загрузки все равно должен принимать объект , а не строку в качестве параметра. Вы можете привести его к строке в теле вашего метода.
источник
Вы хотите использовать
ParameterizedThreadStart
делегат для потоковых методов, которые принимают параметры. (Или вообще ничего, и пустьThread
конструктор выведет.)Пример использования:
источник
Тебе тоже может
delegate
понравиться ...источник
В дополнение
источник
Вы можете инкапсулировать функцию потока (загрузить) и необходимый параметр (ы) (имя файла) в классе и использовать делегат ThreadStart для выполнения функции потока.
источник
Я бы порекомендовал вам иметь другой класс с именем File.
И в своем коде создания потока вы создаете новый файл:
источник
Как насчет этого: (или это нормально использовать как это?)
источник
По твоему вопросу ...
... и ошибка, с которой вы столкнулись, вам придется исправить свой код с
в
Тем не менее, вопрос более сложен, как кажется на первый взгляд.
В
Thread
настоящее время класс (4.7.2) предоставляет несколько конструкторов иStart
метод с перегрузками.Эти соответствующие конструкторы для этого вопроса:
и
которые либо принимают
ThreadStart
делегата, либоParameterizedThreadStart
делегата.Соответствующие делегаты выглядят так:
Итак, как можно видеть, правильный конструктор, который нужно использовать, - это тот, который принимает
ParameterizedThreadStart
делегат, так что поток, соответствующий некоторому методу, соответствующему указанной сигнатуре делегата, может быть запущен потоком.Простой пример создания экземпляра
Thread
класса:или просто
Сигнатура соответствующего метода (вызываемого
Work
в этом примере) выглядит следующим образом:Осталось только начать тему. Это делается с помощью либо
или
Хотя
Start()
бы запустить поток и передатьnull
как данные в метод,Start(...)
может использоваться для передачи чего-либо вWork
метод потока.Однако у этого подхода есть одна большая проблема: все, что передается в
Work
метод, преобразуется в объект. Это означает, что вWork
методе он должен быть снова приведен к исходному типу, как в следующем примере:Кастинг - это то, что вы обычно не хотите делать.
Что если кто-то пропустит что-то еще, не являющееся строкой? Поскольку вначале это кажется невозможным (поскольку это мой метод, я знаю, что я делаю, или метод частный, как кто-то может быть в состоянии что-либо передать ему? ), Вы можете в конечном итоге получить именно этот случай по разным причинам. , Поскольку некоторые случаи могут не быть проблемой, другие - нет. В таких случаях вы, вероятно, в конечном итоге
InvalidCastException
получите, который вы, вероятно, не заметите, потому что он просто завершает поток.В качестве решения вы ожидаете получить общий
ParameterizedThreadStart
делегат, например,ParameterizedThreadStart<T>
гдеT
будет тип данных, которые вы хотите передать вWork
метод. К сожалению что-то подобное не существует (пока?).Однако есть предложенное решение этой проблемы. Он включает в себя создание класса, который содержит как данные, которые будут переданы потоку, так и метод, который представляет рабочий метод следующим образом:
При таком подходе вы начинаете поток так:
Таким образом, вы просто избегаете перебора и имеете безопасный способ предоставления данных потоку ;-)
источник
вот идеальный способ ...
источник