Использование await для задачи, не требующей интенсивного использования процессора - PullRequest
1 голос
/ 26 января 2011

У меня есть что-то вроде этого:

private void DoSomething()
{
    System.Console.WriteLine("Creating Foo");
    Foo result = new Foo();

    DoSomethingAsync();

    System.Console.WriteLine("Returning Foo");
    return result;
}


private async void DoSomethingAsync()
{
    // The following task takes a long time, but is not CPU intensive
    await TaskEx.Run(() =>
    {
         // code lives here... removed for this example
    });
}

Так как я не сильно бью процессор, мне не нужна нить.Что я могу использовать вместо Run, чтобы избежать создания потока?

Ответы [ 2 ]

1 голос
/ 26 января 2011

Я думаю, что вы неправильно понимаете цель шаблона асинхронности задач.Вероятно, то, что вы делаете, лучше обрабатывается с помощью ThreadPool.QueueUserWorkItem, который будет повторно использовать рабочий поток из пула процесса, создавая его только при необходимости.

TAP позволяет вам прервать задачуна «куски» работы, которые могут обрабатываться пошагово, но напрямую не дают средства сказать «это фоновая задача».

0 голосов
/ 26 января 2011

Это зависит от задачи, которую вы делаете. Поскольку вы говорите, что он не использует много ЦП, я предполагаю, что задача занимает много времени, потому что она ожидает других событий. Итак, вам нужно спроектировать задачу для регистрации обратных вызовов для тех событий, где каждый обратный вызов быстро завершается в главном потоке, но не запускается до тех пор, пока событие, которое вы ожидаете, не произойдет.

...