Когда мы пишем программы удаленного взаимодействия или другие приложения, нам неизбежно приходится иметь дело с потоками. .Net позволяет нам легко создавать потоки, но методы, которые он предоставляет для создания потоков и запуска потоков, не предоставляют очевидных параметров. Что мне делать. если я хочу использовать поток для запуска метода с параметрами в классе? Ниже приводится краткое введение о том, как использовать богатую среду, предоставляемую .NET, для реализации этой функции. Чтобы представить весь процесс в ярких деталях, я создал следующий класс .NET, который также является носителем метода запуска потока. Класс выглядит следующим образом:
using System;
пространство имен WindowsApplication1
{
/// <summary>
/// Краткое описание UrlFetcher
/// </summary>
public class MyClass{.
// для метода 1
Private string _parameter;
public MyClass(stringparameter){
this._parameter =parameter;
}
public void MyMethod1(){
if(this._parameter!=null){
// делаем что-нибудь
Console.Write(this._parameter );
}
}
// для метода 2
public MyClass(){}
// этот метод является частным, но он может быть общедоступным или другим
частным void MyMethod2(stringparameter){
// сделать что-нибудь
Console.Write(parameter);
//
Потому что делегат WaitCallback's; Тип параметра — объект
// Я преобразую его в строку.
public void MyMethod2(параметр объекта) {
this.MyMethod2((string)parameter)
;
// для метода 3
public string MyMethod3(stringparameter){
return "Значение параметра:"+parameter
;
// для переданных параметров mutil
public string MyMutilParameters(string param1,string param2){
return "Результат соединения параметра 1 и параметра 2: "+param1+param2
}
;
}
}
Хе-хе, у меня плохой английский. Пожалуйста, простите меня за плохое написание комментариев (потому что они на английском языке), надеюсь, это не повлияет на ваше чтение. Я думаю, что мне необходимо кратко рассказать о содержании, содержащемся в приведенном выше классе. Во-первых, он содержит два конструктора: один с параметрами, другой без (это сделано намеренно). Я думаю, вы догадаетесь об этом по именам других методов в классе. Я представлю 3 метода для передачи параметров, а затем представлю их один за другим. Сначала давайте посмотрим, как запустить поток. Сначала мы можем использовать функцию для создания экземпляра делегата ThreadStart, а затем использовать этот экземпляр в качестве объекта нового потока (Thread) и, наконец, запустить поток. узнать больше. Для получения дополнительной информации обратитесь к разделу «Тема» документации MSDN.
Чтобы проверить наши результаты, я создал проект WinForm, в котором есть форма и 4 кнопки. Если вам нужен весь исходный код, отправьте электронное письмо по адресу [email protected] , я пришлю его вам, если у меня будет время. . Далее следует подробное описание каждого метода.
1. Используйте конструктор для передачи параметров
. Как мы все знаем, мы можем использовать конструктор с параметрами для создания объекта. В этом случае мы можем использовать конструктор, чтобы сначала передать значения параметров, которые будут использоваться в объекте. внутренние переменные в объекте, а затем используйте конструктор без параметров, чтобы использовать этот параметр (притвориться параметром). Проще говоря, объявите переменную в классе специально для сохранения параметров, необходимых функции, и функция станет формой без параметров. Самая большая проблема этого метода заключается в том, что он разрушает инкапсуляцию. Хотя мы не можем напрямую получить доступ к этим переменным, скрытые опасности всегда существуют (или не имеет значения, если это выглядит неприятно). В следующем фрагменте кода подробно описано, как использовать этот метод для передачи параметров. Это также код щелчка для одной из четырех кнопок, упомянутых выше (Button1). Чтобы иметь возможность передавать параметры, я глобально определил в WinForm переменную следующим образом:
// Это значение параметра
Private string myParameter = "ParameterValuen"
Событие кнопки выглядит следующим образом:
// передаем параметры в поток с помощью конструкции
Private; void button1_Click( отправитель объекта, System.EventArgs e) {
MyClass экземпляр = новый MyClass(myParameter);
новый поток (новый ThreadStart(instance.MyMethod1)).Start();
Как
упоминалось выше, мы используем конструктор для передачи параметров в него. класс Go, а затем запустить поток, используя метод, упомянутый выше, мы можем увидеть результат выполнения MyMethod1 в окне вывода после запуска программы (вы также можете использовать TextBox или что-то еще, чтобы отобразить его непосредственно в WinForm): ПараметрЗначение. Просто посмотрите на тело функции, и вы увидите, что результат правильный. Разве это не очень просто?
2. Используйте ThreadPool для реализации передачи параметров.
Сначала мы посмотрим, как MSDN описывает ThreadPool. Предоставляет пул потоков, который можно использовать для публикации рабочих элементов, обработки асинхронного ввода-вывода, ожидания от имени других потоков и обработки таймеров. Просмотрите его коллекцию методов, один из которых называется: QueueUserWorkItem. Подробную информацию об этом классе и этом методе см. в соответствующей справке MSDN. Здесь необходимо отметить параметры метода QueueUserWorkItem. Параметр WaitCallback — это тип делегата. Второй параметр — это параметр, требуемый экземпляром делегата (после создания его экземпляра с помощью функции), то есть функции. типа объекта. Подробности смотрите в коде ниже.
// передан параметр в поток с помощью ThreadPool
Private void button2_Click(object sender, System.EventArgs e) {
MyClass instance = new MyClass();
QueueUserWorkItem (new WaitCallback (instance.MyMethod2),myParameter
}
Из-за двух свойств
);of QueueUserWorkItem Параметры имеют тип объекта, поэтому нам нужно определить две измененные версии MyMethod2 в MyClass, чтобы удовлетворить параметры метода. Аналогичным образом мы передали параметр myParameter и запустили программу. Когда мы нажмем кнопку Button2, в окне вывода появится результат выполнения MyMethod2 myParameter в качестве параметра.
3. Далее идет последний метод использования асинхронного делегирования для реализации передачи параметров
. Аналогично, подробную информацию о делегировании можно найти в MSDN, которая очень подробно описана выше. Здесь мы собираемся использовать методы BeginInvoke и EndInvoke.
Сначаламы
даем метод передачи параметра следующим образом:
// передаваемыйпараметр
асинхронным делегатом
делегата string MyMethod3Delegate(stringparameter)
;
myMethod3 = новый MyMethod3Delegate (instance.MyMethod3);
myMethod3.BeginInvoke («parameterValue», новый AsyncCallback (AfterMyMothod3), null);
}
public void AfterMyMothod3 (результат IAsyncResult) {
AsyncResult async =(
AsyncResult) результат;
async.AsyncDelegate;
Console.WriteLine ("Возвращаемое значение вызова функции: {0}n", DelegateInstance.EndInvoke(result)
}
Сначала, чтобы использовать делегат, мы объявляем делегат MyMethod3Delegate, который указывает параметр и возвращаемое значение. Допускаются функции, являющиеся строками, поэтому мы определяем метод MyMethod3 в MyClass. Структура этой функции соответствует приведенному выше делегату, поэтому мы можем использовать этот метод для создания экземпляра делегата при нажатии кнопки Button3, а затем вызывать этот метод асинхронно. Чтобы получить возвращаемый результат, мы написали метод AfterMyMothod3 для отображения. результаты выполнения функции. Запустите программу и нажмите кнопку Button3, чтобы увидеть, что результаты, выводимые в Output, являются результатами выполнения MyMethod3 с параметрами. Наконец, я даю метод передачи нескольких параметров. Мой пример — передача двух параметров. Код выглядит следующим образом:
// mutil-параметры переданы
делегату string MyMutilParamsDelegate (строковый параметр1, строковый параметр2);
Private void button4_Click(object sender, System.EventArgs e) {
MyClass instance = new MyClass();
MyMutilParamsDelegate mutilParams = new MyMutilParamsDelegate( экземпляр.MyMutilParameters);
mutilParams.BeginInvoke("param1","params2",new AsyncCallback(AfterMutilParams),null)
;
public void AfterMutilParams (результат IAsyncResult) {
AsyncResult async = (AsyncResult) result;
MyMutilParamsDelegate DelegateInstance = (MyMutilParamsDelegate) async.AsyncDelegate;
Console.WriteLine («Вызов многопараметрической функции возвращает результат: {0}n», DelegateInstance.EndInvoke( result ));
}
Из-за нехватки места код не будет подробно объясняться. Поправьте меня, если есть неточности. Спасибо за внимание! Контактная информация: [email protected] Идентификатор форума CSDN: cuike519
Справочные документы: