2009-04-18 2 views
0

Я немного новичок в ThreadPool в .NET. Мне было интересно, если я могу только отправить один объект на мой метод обратного вызова, как я могу получить доступ к переменной-члену класса, чтобы вызвать его методы? (см. customClass в CallBack())Как бороться с ThreadPool и переменными-членами?

И как я могу загрузить данные из customClass? Я передаю customClass другому методу CallBack? это такой подход?

Как вы можете видеть, это немного недостаток опыта, поэтому любые советы по этому пути действительно будут оценены.

Спасибо, KAVE

class Program 
      { 
       static void Main(string[] args) 
       { 
        CustomClass customClass = new CustomClass(); 

       ThreadPool.QueueUserWorkItem(CallBack, "Hello"); 


       Console.Read(); 
      } 

      private static void CallBack(object state) 
      { 
       customClass.SaveData(state.ToString()); 
      } 
     } 

ответ

2
class Program 
{ 
    static void Main(string[] args) 
    { 
    CustomClass customClass = new CustomClass(); 
    ThreadPool.QueueUserWorkItem(x => CallBack(customClass, "Hello")); 
    Console.Read(); 
    } 

    private static void CallBack(CustomClass custom, string text) 
    { 
    customClass.SaveData(text); 
    } 
} 
+0

Хороший образец, но вызов SaveData должен действительно быть SaveData (текст) - просто копировать/вставлять остатки, очевидно ;-) –

+0

wow очень хороший пример! С .NET 3.5 нет необходимости в методах CallBack, у которых объект как параметр больше, это правильно? Я также высоко оценил бы решение .NET 2.0 для этой проблемы, поэтому я знаю оба пути. Есть идеи? – Houman

+0

У меня была идея, будет ли это так, как это делается в мире .NET 2.0? ThreadPool.QueueUserWorkItem (делегат {CallBack (customClass, «World»);}); – Houman

1

Самый простой способ сделать это состоит в использовании closure, чтобы захватить все переменные, которые вы хотите (т.е. использовать анонимный метод или лямбда-выражение). Вы должны быть осторожны в точности то, что фиксироваться, если вы используете цикл, но это удобней, чем прохождение через объект и того, чтобы бросить его обратно на правильный тип и т.д.

+0

Чтобы уточнить, в этом вопросе необходимо обратить внимание на необходимость осторожности в цикле с закрытием: http://stackoverflow.com/questions/271440/c-captured-variable-in-loop –

1

В дополнение к тому, что было сказал: Если CustomClass находится под вашим контролем и асинхронно вызова SaveData является общим прецедент, вы могли бы подумать о предоставлении метода SaveDataAsync:

class CustomClass { 

    public void SaveDataAsync(string path) { 
     ThreadPool.QueueUserWorkItem(state => this.SaveData(path)); 
    } 

    public void SaveData(string path) { 
     ... 
    } 
} 

См the Event-based Asynchronous Pattern.

+0

Thats очень хороший отзыв. Большое спасибо. – Houman