Использование ожидания для интенсивной задачи без процессора

StackOverflow https://stackoverflow.com/questions/4800111

  •  22-10-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top