Comment faire pour forcer la Tâche.Usine.StartNew à un thread d'arrière-plan?

J'ai vu de nombreuses autres questions semblables à cela, mais n'a pas trouvé ma réponse.

Mon problème était que j'étais la création de threads avec le flux suivant:

private void btn_Click(object sender, EventArgs e)
{
    service.GetCount(
        (count, ex) =>
        {
            if (ex != null)
                return;

            for (int i = 0; i < count; i++)
            {
                service.Get(onItemReceived, i);
            }
        }
    );
}

public void GetCount(Action<int, Exception> callback)
{
    var callingThread = TaskScheduler.FromCurrentSynchronizationContext();

    Func<int> action = () =>
    {
        return client.GetCount(); //Synchronous method, could take a long time
    };

    Action<Task<int>> completeAction = (task) =>
    {
        Exception ex = (task.Exception != null) ? task.Exception.InnerException : task.Exception;

        if (callback != null)
            callback(task.Result, ex);
    };

    Task.Factory.StartNew(action).ContinueWith(completeAction, callingThread);
}

public void Get(Action<object, Exception> callback, int index)
{
    var callingThread = TaskScheduler.FromCurrentSynchronizationContext();

    Func<object> action = () =>
    {
        return client.Get(index); //Synchronous method, could take a long time
    };

    Action<Task<object>> completeAction = (task) =>
    {
        Exception ex = (task.Exception != null) ? task.Exception.InnerException : task.Exception;

        if (callback != null)
            callback(task.Result, ex);
    };

    Task.Factory.StartNew(action).ContinueWith(completeAction, callingThread);
}

De cette façon, chacun de mes service asynchrone de méthodes de rappel du fil ils ont été à l'origine appelé généralement le thread d'INTERFACE utilisateur). Je suis donc à simuler comment les attendent/async mots-clés travail (je ne peut pas utiliser .NET 4.5).

Le problème avec ce modèle est que je inexplicablement verrouillé sur le thread de l'INTERFACE utilisateur après le premier appel à "ContinueWith". Dans ce cas, si je tente de me frayer 5 threads à chaque processus une fonction synchrone Obtenir, ils exécutent 1 par 1 au lieu d'en parallèle et ils vont bloquer le thread d'INTERFACE utilisateur en faisant de la sorte, même si j'ai essayer de préciser TaskCreationOptions.LongRunning.

Cela n'arrive jamais avec mon premier appel à la Tâche.Usine.StartNew, cela n'arrive que pour les appels suivants de l'intérieur le premier rappel.

OriginalL'auteur Trevor Elliott | 2013-04-11