2010-01-07 4 views
2

Est-il possible de le faire:comment utiliser QueueUserWorkItem avec l'état ref/out?

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ref data); 

telle que mon ThreadProc pourrait faire le point de données de l'appelant vers un autre emplacement que lorsque l'appel provient?

Si ce n'est pas possible, existe-t-il un moyen de mettre en œuvre une telle fonctionnalité avec IntPtr ou quelque chose?

Répondre

1

Non, simplement parce que la définition de WaitCallback(object state) contient un paramètre non-ref.

Et si vous le pouviez, ce serait intrinsèquement non-threadsafe.

+0

..hahaha, je viens d'ajouter la même chose à ma réponse .. –

1

Non, QueueUserWorkItem ne prend pas en charge cette signature, en plus de cela serait un cauchemar à déboguer dans une application multithread.

1

Non, et il serait déconseillé d'essayer d'implémenter la fonctionnalité vous-même. La définition d'un thread signifie que vous n'avez aucune idée quand il va modifier la valeur de data. Passer n'importe quoi en référence à un thread garantirait pratiquement une sorte de condition de course ou de violation de la concurrence.

2

Ici, vous allez, l'échantillon de travail complet:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading; 

namespace ConsoleApplication19 { 
    class Program { 

     static object sync = new object(); 

     static void Main(string[] args) { 
      int counter = 0; 
      ThreadPool.QueueUserWorkItem(new WaitCallback((_) => ThreadProc(ref counter)), null); 

      while (true) { 
       lock (sync) { 
        if (counter == 1) break; 
       }  
       Thread.Sleep(1); 
      } 

      Console.Write(counter); 
      Console.Read(); 

     } 

     static void ThreadProc(ref int counter) { 
      lock (sync) { 
       counter++; 
      } 
     } 
    } 
} 

Note:

Du point de vue de la concurrence, vous jouez avec le feu beaucoup de temps. Lorsque cela devient délicat, vous commencez à risquer des blocages et toutes sortes de méchancetés.

+0

@ sam..i ne voulait pas publier d'exemples de code, parce que c'est très très dangereux. Je ne pense pas que je serais capable de dormir la nuit si je trouve ce code quelque part :) .. mais +1 pour un exemple complet –

0

C'est tellement simple. Utilisez un objet de classe en tant qu'objet d'état. En fait, la référence à l'objet de classe sera transmise par la création du thread et par conséquent vous aurez les propriétés publiques de la classe comme variables mutuelles entre le thread maker et le thread créé.