2012-03-26 2 views
2

На данный момент я начала работать:Как отправить параметры вместе с методом в новый поток?

public void logowanie() 
{ 
int x=5,y=5; 
... 
} 

private void button2_Click(object sender, EventArgs e) 
     { 
      Thread thread2 = new Thread(new ThreadStart(logowanie)); 
      thread2.Start(); 
      //logowanie("xd", "xd", "xd"); 

     } 

И это работает. Можно ли сделать что-то вроде

public int logowanie(int x, int y) 
{ 
... 
} 

private void button2_Click(object sender, EventArgs e) 
     { 
      Thread thread2 = new Thread(new ThreadStart(logowanie(5,5))); 
      thread2.Start(); 
      //logowanie("xd", "xd", "xd"); 

     } 

Я только что начал с нарезки вещей. Спасибо

ответ

5

В то время как вы могли использовать ParameterizedThreadStart, Я бы, наверное, просто использовать лямбда-выражение:

private void button2_Click(object sender, EventArgs e) 
{ 
    Thread thread2 = new Thread(() => logowanie(5, 5)); 
    thread2.Start(); 
} 

Обратите внимание, что если вы звоните это в цикле, вы должны быть осторожными из-за способа, что переменные захватываются лямбда-выражений:

// Broken (before C# 5) 
foreach (string url in urls) 
{ 
    new Thread(() => CrawlUrl(url)); 
} 

// Fixed 
foreach (string url in urls) 
{ 
    string copy = url; 
    new Thread(() => CrawlUrl(copy)); 
} 

Это только проблема в определенных ситуациях, когда вы захватываете переменную и действительно хотите записать текущее значение вместо этого, но об этом стоит знать.

+0

+1 Хе-хе, это приятно :-) Не понимал, что ты можешь это сделать. –

+0

спасибо, самый простой и быстрый способ! :) – Patryk

0

Создайте новый класс или структуру. Передай это и брось.

+0

Ну, он wan ts, чтобы знать, как это передать, так что этот ответ немного расплывчатый, не так ли? –

2

Вы можете использовать ParameterizedThreadStart и передать объект в теме:

class ParametersForThread 
{ 
    public int x; 
    public int y; 
} 

... 

Thread thread2 = new Thread(new ParameterizedThreadStart(logowanie)); 
thread2.Start(new ParametersForThread() { x = 5, y = 5 }); 

Ваш метод поток должен выглядеть

void logowanie(object state) 
{ 
    ParametersForThread parameters = state as ParametersForThread; 
    ....; 
} 
+0

Кажется, что много работы, когда анонимная функция подойдет вам правильно :) –

+0

Да, я написал комментарий к вам. На самом деле, однако, этот метод является чрезвычайно гибким, если вы хотите использовать класс ParametersForThread также для возврата результата - или (если не использовать Задачи), как бы вы это сделали? –

0

Используйте делегат. Вы можете определить свой собственный или использовать один из встроенных в них общего назначения, такие как Action, Action (T) или, в вашем случае действий (T1, T2)

private Action<int,int> myLoggingDelegate; 


private void button2_Click(object sender, EventArgs e) 
{ 
    myLoggingDelegate = logowanie; 
    myLoggingDelegate.BeginInvoke(myParam1,myParam2,Callback,null); //this is aynchronous 
} 

private void Callback(IAsyncResult ar) 
{ 
    myLoggingDelegate.EndInvoke(ar); 
} 
0

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

void method() 
{ 
    int a = 5, b = 6; 
    Thread t = new Thread(delegate() 
    { 
     CallOtherMethodOnTheNewThread(a, b); 
    }); 
    t.Start(); 
} 
0

Шаг 1: создать класс для объединения параметров на одном объекте:

private class ThreadParams { 
    public int X { get; set; } 
    public int Y { get; set; } 
    public ThreadParams(int x, int y) 
    { 
    this.X = x; 
    this.Y = y; 
    } 
} 

Шаг 2: объявить этот объект на вашем методе:

public void logowanie(ThreadParams param) 
{ 
... 
} 

Шаг 3: отправить значения с параметризованнымThreadStart:

Thread thread = new Thread(new ParameterizedThreadStart(logowanie)); 
ThreadParams prm = new ThreadParams(5,5); 
thread.Start(prm); 
Смежные вопросы