2015-09-16 3 views
3

У меня есть этот метод, который я хотел бы запустить асинхронно, чтобы я мог делать другие вещи во время его запуска. Он не полагается ни на какой другой метод Async (он не обращается к другому ресурсу, скачивает файл или что-то еще). Я хотел бы избежать использования new Task(), Task.Factory.StartTask() и Task.Run(), если это возможно.Как асинхронно использовать этот длинный метод?

Возможно ли запустить этот метод асинхронно, с аккуратным, читаемым кодом и без использования задачи явно?

Если нет, то какой самый простой способ запускать метод асинхронно?

Примечание: Пожалуйста, не беспокойтесь о глупой логике в методе - я заварил ее, чтобы быть преднамеренно медленным, но не показывать мой фактический код.

public static void main(string[] args) 
{ 
    RunMySlowLogic(); 
} 

private void RunMySlowLogic() 
{ 
    while (true) 
    for (int i=0; i<100000000;i++) 
     if (i == new Random().Next(999)) 
     return true; 
} 

В настоящее время, я считаю, что мне нужно будет обернуть метод в лямбда или Задаче и пометить его как асинхронный. Куда будет ждать?

+1

просмотреть этот http://stackoverflow.com/questions/32617702/how-to-async-this-long-running-method программы – Sievajet

+0

Консоль может не 'await'. –

+0

Если вы просто хотите запустить этот код в отдельном потоке, и ему не нужно ждать каких-либо других методов async, тогда вы можете просто выполнить 'Task.Factory.StartNew (RunMySlowLogic)'. Вы также можете добавить флаг LongRunning, если хотите. –

ответ

7

Вы вводите в заблуждение две разные вещи. Вы можете запустить это в фоновом режиме, и этот метод может быть асинхронным. Это две разные вещи, и ваш метод может сделать либо, либо и то, и другое.

Если вы делаете что-то асинхронное в этом методе, как Task.Delay или некоторые неблокирующая I/O затем вызвать этот метод, ждать возвращаемые задачи и сделать сам метод асинхронным:

async Task RunMySlowLogicAsync() 
{ 
    while (true) 
    { 
     // ... 
     await Task.Delay(1000); 
    } 
} 

Если вы не» t есть такая вещь, тогда ваш метод не асинхронный, он синхронный. Вы все еще можете запустить его в фоновом режиме на другой (ThreadPool) нити в то время как вы делаете другие вещи, используя Task.Run:

var task = Task.Run(() => RunMySlowLogic()); 
0

Есть несколько способов выполнения кода асинхронно в среде .NET. Посмотрите на Asynchronous Programming Patterns MSDN article.

Задачи - облегчить вашу работу. Я считаю, что единственной допустимой причиной, почему следует избегать использования задач, является таргетинг на более старую версию .NET.

Итак, без задач вы можете сами начать тему или использовать ThreadPool (Задачи делают это внутренне).

public static void main(string[] args) 
{ 
    var are = new AutoResetEvent(false); 
    ThreadPool.QueueUserWorkItem(RunMySlowLogicWrapped, are); 
    // Do some other work here 
    are.WaitOne(); 
} 

// you have to match the signature of WaitCallback delegate, we can use it to communicate cross-thread 
private void RunMySlowLogicWrapped(Object state) { 
    AutoResetEvent are = (AutoResetEvent) state; 
    RunMySlowLogic(); 
    are.Set(); 
} 

private bool RunMySlowLogic() 
{ 
    while (true) 
    for (int i=0; i<100000000;i++) 
     if (i == new Random().Next(999)) 
     return true; 
} 
+0

RunMySlowLogic может вернуть true? это азартная игра. после 999 года он никогда не вернется. –

+0

@NuriYILMAZ Я не заметил, что, просто скопировал это из вопроса. –

Смежные вопросы