Как бороться с ThreadPool и переменными-членами? - PullRequest
0 голосов
/ 18 апреля 2009

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

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

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

Спасибо, Кава

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());
            }
        }

Ответы [ 3 ]

2 голосов
/ 18 апреля 2009
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);
  }
}
1 голос
/ 18 апреля 2009

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

class CustomClass {

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

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

См. Асинхронный шаблон на основе событий .

1 голос
/ 18 апреля 2009

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

...