2012-03-07 2 views
1

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

rulehandler является объектом класса

Thread applyPolicyThread = new Thread(
     new ParameterizedThreadStart(rulehandler.ApplyPolicy)); 
applyPolicyThread.start(false); 

Это дает ошибку, что ни один метод перегрузки для применения политики не соответствует делегирует system.threading.start

+0

Можете ли вы показать подпись 'rulehandler.ApplyPolicy'? Основываясь на том, что мало я могу вывести из опубликованного кода, он должен выглядеть как «void ApplyPolicy (object p)». –

+0

public void ApplyPolicy (bool isNewPolicy) –

ответ

4

Тип параметра для параметризованных потоков всегда должны быть object (см HERE):

public void ApplyPolicy(object param) 
{ 
    bool value = (bool)param; 
    //your code 
} 
+0

Извините, я не понимал, что вы разговариваете о самой ApplyPolicy. Вы правы, поэтому +1;) – BlackBear

+0

Вид «старой школы» в наши дни, если можно. Если вам не понадобится нить, чтобы начать синхронно (но выполнять асинхронно, конечно). –

+0

@Baboon: Да, я согласен в большинстве случаев, но это был ответ на вопрос, почему возникает исключение. Потоки IMO следует использовать для чего-то, что работает «всегда» в фоновом режиме (например, TcpListner сервера), а «Задача» должна использоваться для «коротких» фоновых задач (что, я думаю, в этом случае) ... – ChrFin

1

Почему бы не использовать TPL:

Task.Factory.StartNew(() 
    => 
    { 
     //This is executed in a separate thread 
     ruleHandler.ApplyPolicy(false)) 
    }); 

Это начнет новый поток при удобстве системы (не сразу, а вскоре после этого).
Он позволяет передавать строго типизированные параметры.

+0

Работает ли он как нить? –

+0

Да, это так. Я уточню. –

+0

Пожалуйста, определите его немного о Task.Factory.StartNew() –

0

Это не то, как вы используете ParameterizedThreadStart. Вам необходимо пройти метод в качестве аргумента, как это:

Thread applyPolicyThread = new Thread(
     new ParameterizedThreadStart(Start)); 
applyPolicyThread.start(false); 

Где Start представляет собой метод, как этот

static void Start(object info) 
    { 
    // This receives the value passed into the Thread.Start method. 
    } 
0

Не уверен, что rulehandler.ApplyPolicy есть, но вы должны передать метод с object в качестве единственного аргумента (вы можете бросить его внутрь):

void ApplyPolicy(object someState) 
{ 
    bool boolState = (bool)someState; 
    ... 
} 
0

вы можете сделать это, не создавая какую-либо методы аргумента в качестве мишени для threadstart(), и из этого метода без аргументов вы можете вызвать свой фактический метод с параметрами.

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