2010-08-30 2 views
11

Я создаю приложение для рабочего стола C#. Как вызвать метод, который принимает несколько параметров в потоке. У меня есть метод Send (string arg1, string arg2, string arg3), мне нужно вызвать этот метод, используя поток, называемый SendingThread. Может ли кто-нибудь помочь с этим? Любая помощь будет высоко оценена.Как вызвать метод, который принимает несколько параметров в потоке?

ответ

23
Thread thread = new Thread(() => Send(arg1, arg2, arg3)); 
thread.Start(); 
+0

@ prateeksaluja20: Я отредактировал этот ответ, чтобы использовать имя метода. Яснее? – Timwi

+0

выглядит неплохо для меня, в качестве альтернативы вы можете обернуть всю функциональность sendthread в своем собственном классе http://paste.pocoo.org/show/256213/ –

+0

@ f00 зачем тратить время и силы на создание класса замыкания, когда компилятор это для вас? – Will

2

Вы можете определить тип, который инкапсулирует параметры, которые вы хотите передать, и запустить поток с ссылкой на экземпляр этого типа.

+0

При понижающем голосовании, пожалуйста, оставьте комментарий. Благодарю. –

+0

хороший ответ, но как насчет прерывания указанной нити? –

+0

f00: Не уверен, что я последую за вами здесь. Что вы имеете в виду? Ничего особенного в потоке, который начинается с ссылки на объект. –

1

Вы можете определить промежуточный метод и вспомогательный объект, чтобы сделать это:

public void MethodToCallInThread(string param1, string param2) 
{ 
    ... 
} 
public void HelperMethod(object helper){ 
    var h = (HelperObject) helper; 
    MethodToCallInThread(h.param1, h.param2); 
} 

И тогда вы начинаете нить с HelperMethod, а не с MethodToCallInThread:

var h = new HelperObject { param1 = p1, param2 = p2 } 
ThreadPool.QueueUserWorkItem(HelperMethod, h); 
+0

Может кто-нибудь, пожалуйста, объясните -1 ?? –

+0

У меня такое же :). это обычная глупая ситуация ... мне нравится красный цвет, но другой нравится желтый :) и я ненавижу все NON red-funs. – garik

+0

Я подозреваю, что -1 предназначен для использования древнего стиля прохождения параметров, который действительно довольно громоздкий по сравнению с новым стилем, доступным в современных версиях C#. –

-1

это может помочь. Вы можете определить свой метод отправки следующим образом, а затем можете использовать параметры.

string[] parameters = new string[3]; 
parameters[0] = arg1; 
parameters[1] = arg2; 
parameters[1] = arg3; 

System.Threading.Thread SendingThread = new System.Threading.Thread(Send); 
SendingThread.Start(parameters); 


public void Send(object parameters) 
{ 
    Array arrayParameters = new object[3]; 
    arrayParameters = (Array)parameters; 
    string str1 = (string)arrayParameters.GetValue(0); 
    string str2 = (string)arrayParameters.GetValue(1); 
    string str3 = (string)arrayParameters.GetValue(2); 

    ///Following code here... 
} 
+2

① Это излишне удаляет всю безопасность типов.(Необязательно, потому что вы можете просто передать строки вместо объекта.) ② Использование 'Array' действительно странно. Почему бы не привести к 'string []' напрямую? ③ Почему вы назначаете «новый объект [3]», а затем сразу же устарели? Это избыточно. ④ Что такое 'ReceiveMsgThread'? Вы этого нигде не объявили. ⑤ Что делает этот ответ, который у меня нет (кроме разрушения безопасности типа)? – Timwi

+2

Как подчеркивается Timwi, этот код имеет множество проблем, несмотря на то, что он является принятым ответом. Пожалуйста, не используйте это. –

+0

@Timwi: Прежде всего да, а не ReceiveMsgThread, это должен быть SendingThread. Мне жаль насчет того. Во-вторых, я взял его как массив, потому что вы не можете напрямую использовать тип объекта для строки []. Я передал строку [] в параметрах аргумента, как бы вы вынимали отдельные строки из параметров объекта. Вам нужно передать его в виде массива и извлечь значения из этого массива, передавая его как строку. Почему бы вам просто не попробовать и проверить, возможно ли это. А также в параметрах объекта мы можем передавать строки, int и т. Д. На разные типы, а затем извлекать соответствующие типы позже. –

Смежные вопросы