¿Cómo lidiar con las variables ThreadPool y miembros?
-
11-09-2019 - |
Pregunta
Soy un poco nuevo ThreadPool en .NET. Me preguntaba, si yo puedo enviar un objeto a mi método de devolución de llamada, ¿cómo he podido acceder a la variable miembro de clase para llamar a sus métodos? (Ver CustomClass en CallBack ())
Y cómo iba a cargar los datos de CustomClass? Cómo puedo pasar el CustomClass a un método de respuesta diferente? está bien este enfoque?
Como se puede ver que es un poco de falta de experiencia, por lo que cualquier consejos en el camino realmente sería apreciada.
Gracias, 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());
}
}
Solución
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);
}
}
Otros consejos
La forma más sencilla de hacerlo es utilizar un cierre para capturar toda la variables que desee (es decir, utilizan un método anónimo o una expresión lambda). Usted necesita tener cuidado sobre exactamente lo que está capturado si estás usando un bucle, pero es más práctico que pasa a través de un objeto y tener que echarlo de nuevo al tipo correcto, etc.
Además de lo que se ha dicho: Si CustomClass
está bajo su control y de forma asíncrona invocando SaveData
es un caso de uso común, se podría pensar en proporcionar un método SaveDataAsync
:
class CustomClass {
public void SaveDataAsync(string path) {
ThreadPool.QueueUserWorkItem(state => this.SaveData(path));
}
public void SaveData(string path) {
...
}
}