Como lidar com variáveis ??de ThreadPool e membro?
-
11-09-2019 - |
Pergunta
Eu sou um pouco novo para ThreadPool no .NET. Eu estava pensando, se eu só pode enviar um objeto para o meu método de retorno de chamada, como eu sou capaz de acessar a variável de membro de classe para chamar seus métodos? (Veja CustomClass em CallBack ())
E como eu carregar os dados de CustomClass? Faço para passar o CustomClass a um método de retorno diferente? É esta abordagem bem?
Como você pode ver, é um pouco de falta de experiência, de forma alguma dica ao longo do caminho seria muito apreciada.
Obrigado, 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());
}
}
Solução
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);
}
}
Outras dicas
A maneira mais fácil de fazer isso é usar um fechamento para capturar toda a variáveis ??que você quer (ou seja, usar um método anônimo ou uma expressão lambda). Você precisa ser cuidadoso sobre o que exatamente é capturado se você estiver usando um loop, mas é mais acessível do que passando por um objeto e ter de lançá-lo de volta para o tipo certo etc.
Além do que foi dito: Se CustomClass
está sob seu controle e de forma assíncrona invocando SaveData
é um caso de uso comum, você poderia pensar sobre o fornecimento de um método SaveDataAsync
:
class CustomClass {
public void SaveDataAsync(string path) {
ThreadPool.QueueUserWorkItem(state => this.SaveData(path));
}
public void SaveData(string path) {
...
}
}