Domanda

Sono un po 'nuova per ThreadPool in .NET. Mi chiedevo, se posso inviare solo un oggetto al mio metodo di callback, come sono io in grado di accedere alla variabile membro della classe di chiamare i suoi metodi? (Vedi CustomClass in CallBack ())

E come avrei caricare i dati da CustomClass? Faccio a passare il CustomClass a un metodo di callback diverso? è questo approccio va bene?

Come si può vedere si tratta di un po 'di mancanza di esperienza, in modo eventuali suggerimenti lungo la strada realmente sarebbe apprezzato.

Grazie, 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());
            }
        }
È stato utile?

Soluzione

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

Altri suggerimenti

Il modo più semplice per farlo è quello di utilizzare un chiusura per catturare tutta la variabili che si desidera utilizzare (ad esempio un metodo anonima o un'espressione lambda). È necessario essere attenti a esattamente cosa sta catturato se si sta utilizzando un ciclo, ma è più comodo che passando attraverso un oggetto e di dover lanciare di nuovo al giusto tipo ecc.

In aggiunta a quanto detto: se CustomClass è sotto il vostro controllo e in modo asincrono invocando SaveData è un caso di uso comune, si potrebbe pensare di fornire un metodo SaveDataAsync:

class CustomClass {

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

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

l'evento a base di Asynchronous modello .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top