2016-10-11 46 views
-1

當掛我有凍結當我開始以下任務的界面WPF應用程序(C#6.0,.NET 6.1,Visual Studio的2015年,64):接口使用長時間運行的任務

private async void ComputeButton_Click(object sender, RoutedEventArgs e) { 
    await Scanner(); 
    DrawButtons(); 
} 

private static async Task Scanner() { 
    try { 
    BigBox.DoScan(); 
    await Task.CompletedTask; 
    } catch (Exception ex) { 
    SMErrorLog.WriteLog("Scanner error: ", ex); 
    } 
} 

我的應用程序由幾個選項卡組成。上面的代碼位於其中一個選項卡中。如果我點擊「計算」按鈕,計算會繼續進行(幾分鐘),但在計算過程中,我無法選擇任何其他選項卡來執行其他操作。我假設上面的代碼是異步的,我不明白爲什麼應用程序在DoScan運行時凍結。

任何幫助或建議將不勝感激。

查爾斯

+0

BigBox.DoScan是做什麼的?什麼是'Task.CompletedTask'? –

+0

BigBox.DoScan是掃描SQL Server 2016數據庫的庫例程。它看起來大約有2000張桌子尋找不尋常的圖案。 – CBrauer

+0

Task.CompletedTask位於Microsoft任務庫中。 – CBrauer

回答

1

爲了使您的UI響應不同,需要一個新的任務執行BigBox.DoScan() ,然後等待它用的await關鍵字完成異步的,因爲這些發生在不同的任務UI不會凍結:

private async void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     await Scanner(); 
    } 

    private static async Task Scanner() 
    { 
     try 
     { 
      await Task.Run(() => 
      { 
       BigBox.DoScan(); 
      }); 

     } 
     catch (Exception ex) 
     { 
      SMErrorLog.WriteLog("Scanner error: ", ex); 
     } 
    } 
+1

謝謝只讀存儲器。它現在正常工作。 – CBrauer