2017-02-20 18 views
-1

мой код компилируется правильно, но получает предупреждение называетсяC# Winform: долго выполняющиеся операции с асинхронным ждут

Этот метод асинхронной не хватает «поджидают» операторов и будет работать синхронно. Рассмотрите возможность использования оператора «ожидание» для ожидания неблокирующих вызовов API, или «ожидание Task.Run (...)» для работы с привязкой к процессору в фоновом потоке.

private async void Form1_Load(object sender, EventArgs e) 
    { 
     //await longRunningRoutine(); 

     await Task.Run(async() => 
     { 
      await longRunningRoutine(); ; 
     }); 
     label1.Text = "hello test"; 

    } 

    public async Task longRunningRoutine() 
    { 
     await Task.Delay(10000); 
    } 

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

+0

Что делает 'longRunningRoutine()' на самом деле? –

+2

Замените сон 'await Task.Delay (10000);' – Equalsk

+0

Ваш метод async (longRunningRoutine) не имеет ожидающих операторов и будет работать синхронно ... – Evk

ответ

2

Если вы не имеете awaitable метода дождаться (который вы не), вы будете иметь создать Task, чтобы запустить его, и ожидать, что задача:

private async void Form1_Load(object sender, EventArgs e) 
{ 
    await Task.Run(() => longRunningRoutine()) 
} 

public void longRunningRoutine() 
{ 
    System.Threading.Thread.Sleep(10000); 
} 
1

Предупреждение говорит, что вы вызываете асинхронно с вызовом longRunningRoutine, но этот метод не имеет какого-либо асинхронного запроса.
Для решения этого предупреждения необходимо вызвать этот метод синхронно или вам нужно вызвать асинхронно в спящем режиме с помощью Task.Delay

+0

Я бы предположил, что OP фактически не заинтересован в вызове 'Sleep()' - он просто использует это для имитации синхронной операции, которая занимает некоторое время. –

+0

Я согласен с вами (по этой причине я поддержал ваш ответ), но так как он спрашивает, почему он получает эту ошибку, я просто написал объяснение и два возможных способа его решения (третий уже вывешен вами). – Tinwor

1

Ваш метод longRunningRoutine уже является асинхронным - так что вы можете удалить Task.Run, которые только тратить дополнительную нить

private async void Form1_Load(object sender, EventArgs e) 
{ 
    await longRunningRoutine(); 
    label1.Text = "hello test"; 
} 

Затем, чтобы следовать соглашениям, предлагаем переименовать метод, добавив ..Async суффикс - он сэкономит несколько секунд вашего времени, когда вы прочитаете код.