2010-08-05 3 views
1

Я пытаюсь получить поток, работающий в C#, чтобы сбросить время и запустить другую функцию рядом с ним. Код у меня есть:Создание потоков в C#

Thread loopTime = new Thread(this.someFunction); 
loopTime.Start(); 

for (int i = 0; i < 20; i++) 
{ 
    ChangeTimeFunction(someTime); 
    Thread.Sleep(200); 
} 

Я получаю ошибку потоковую, если я прохожу в this.SomeFunction(). Это невозможно использовать в соответствии с Visual Studio. Я мог бы использовать цикл for как поток, но я не знаю, как передать переменную someTime.

Есть ли способ передать переменную в цикл, если она была функцией или вызвать цикл for из функции.

Спасибо за любую помощь.

UPDATE:

SomeFunction является записанные методы, использующие Visual Studio. Это невозможно использовать вне основного потока. Мне нужно было бы поставить цикл for внутри потока, который я создаю. Кто-нибудь знает как это сделать?

Благодаря

+0

Не могли бы вы включать Definiton из SomeFunction? –

ответ

4

Есть ли способ, чтобы либо передать переменную в петлю, если он был функции или вызвать цикл из внутри функции.

У .NET есть два делегата для запуска потоков. Первый - ThreadStart, который просто вызывает метод без аргументов.

Второй - ParameterizedThreadStart, который вызывает метод с одним object в качестве параметра.

C# неявно создает делегат ParameterizedThreadStart, если вы передадите метод в конструкторе Thread, который имеет аргумент object. Затем вы отправляете object с использованием метода потока .Start(Object).

Например, чтобы сделать цикл нить, предполагая, что когда-нибудь это DateTime и в том числе приведение к тому эффекту:

Thread loopTime = new Thread(someFunction); 
loopTime.Start(someTime); 

public void someFunction(object someTime) { 
    for (int i = 0; i < 20; i++) 
    { 
     // Note the cast here... I assumed it's a DateTime 
     ChangeTimeFunction((DateTime) someTime); 
     Thread.Sleep(200); 
    } 
} 
+0

@ R. Bemrose - ссылка ParameterizedThreadStart была идеальной. Спасибо +1 – chrissygormley

0

Это не похоже на проблему «этого» квалификатора.

Имеет ли ваш someFunction параметр? Если да, вы можете:

  1. Сделать это без параметров и передавать данные через поле члена
  2. Использование можно использовать замыкание, чтобы передать переменную из внешней области.

    int i = 2; 
    Thread t = new Thread(x => 
              { 
               i++;          
              }); 
    
    t.Start(); 
    
Смежные вопросы