web-dev-qa-db-fra.com

Démarrer une tithdread en C #

Je suis toujours un peu nouveau pour C #, et surtout le filetage en C #. J'essaie de démarrer une fonction qui nécessite un seul appartement fileté ( Stathread )

Mais je ne suis pas capable de compiler le code suivant:

La fonction ressemble à une classe distincte appelée MyClass:

internal static string DoX(string n, string p)
        {
            // does some work here that requires STAThread
        }

J'ai essayé l'attribut [Stathread] en haut de la fonction mais cela ne fonctionne pas.

J'essaie donc de créer un nouveau fil comme suit:

 Thread t = new Thread(new ThreadStart(MyClass.DoX));

mais cela ne compilera pas (la meilleure méthode surchargée a une erreur d'arguments non valide). Cependant, l'exemple en ligne est très similaire ((exemple ici) Qu'est-ce que je fais-je mal et comment puis-je simplement faire fonctionner une fonction dans un nouveau fil de STA?

Merci

21
Saher Ahwal
Thread thread = new Thread(() => MyClass.DoX("abc", "def"));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

Si vous avez besoin de la valeur, vous pouvez "capturer" qui redevient une variable, mais notez que la variable n'aura pas la valeur jusqu'à la fin de l'autre thread:

int retVal = 0;
Thread thread = new Thread(() => {
    retVal = MyClass.DoX("abc", "def");
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();

ou peut-être plus simple:

Thread thread = new Thread(() => {
    int retVal = MyClass.DoX("abc", "def");
    // do something with retVal
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
39
Marc Gravell