2016-11-14 30 views
1

我有一個程序可以通過同時使用後臺線程從7個不同的PLC讀取數據。使用7個不同的讀取,我希望寫入三個不同的SQL表。使用Async/Await使用三個任務寫入SQL

public static async void readReady() 
{ 
    if (Read1_complete && Read2_complete && BCS_complete == true) 
    { 
     await Task.Run(() => W1_SQL_Write.SQL_Write_Enabled()); 
    } 
    if (Read3_complete && Read4_complete && BCS_complete == true) 
    { 
     await Task.Run(() => W2_SQL_Write.SQL_Write_Enabled()); 
    } 
    if (Read5_complete && Read6_complete && BCS_complete == true) 
    { 
     await Task.Run(() => W3_SQL_Write.SQL_Write_Enabled()); 
    } 
} 

的7個讀取方法調用此方法readReady(),如果其他讀取標誌設置,三個SQL寫任務之一被啓動。

我是新來的異步和等待任務。我想知道這是否是一種調用不同方法寫入SQL的好方法?第二個和第三個「if」語句是否等待第一個返回,當第一個「if」語句在手之前被稱爲true時?

所有三種寫入方法可能同時實現,這是否會導致一些錯誤,或者是異步並等待執行的方式?

+4

不要使用'async void',它只能用於事件處理程序。 –

+0

明確地比較真實(BCS_complete == true)幾乎不是一個好主意。 – EJoshuaS

+0

我不確定如果沒有檢查表示讀取已完成的單個標誌的條件,還有什麼其他方法可以解決。你能幫我發表一些不同的想法嗎? – TheException

回答

0

所有三種寫入方法可能同時實現,這是否會導致一些錯誤,或者是異步並等待執行的方式?

當你閱讀asyncawait代碼,嘗試......想起來像這樣每await聲明如下不會執行,直到「期待已久的」操作完成並返回,或者出現了錯誤代碼。對於TaskTask<T>(以及其他等待,即:IAsyncOperation<T>,IAsyncAction等)都是如此。

我在想,如果這是一個很好的方法去調用不同的方法寫入SQL?

我不確定我是否完全明白這個問題。十次中的九次,我更喜歡使用I/O bound操作的異步編程範例 - 數據庫交互肯定是I/O bound,所以是的。

當第一個「if」語句在手之前被稱爲true時,第二個和第三個「if」語句是否等待第一個返回?

if語句本身並沒有等待任何東西。它們將盡可能快地執行,但由於關鍵字await在異步操作完成之前不會被執行。所以人們可以閱讀這段代碼,並期待代碼的順序像同步代碼一樣讀取的「序列化」執行。那有意義嗎?

我可能會改寫這個如下:

更新:

public static async Task ReadReadyAsync() 
{ 
    if (!BCS_complete) return; 

    if (Read1_complete && Read2_complete) 
     await Task.Run(() => W1_SQL_Write.SQL_Write_Enabled()); 

    if (Read3_complete && Read4_complete) 
     await Task.Run(() => W2_SQL_Write.SQL_Write_Enabled()); 

    if (Read5_complete && Read6_complete) 
     await Task.Run(() => W3_SQL_Write.SQL_Write_Enabled()); 
} 

你必須每次通話前的檢查,看看是否BCS_complete位被設置。所以我增加了一個提前退出。那麼因爲所有這些調用都會以序列化的方式執行,所以我們可以這樣寫。

+0

這確實有道理,這篇文章很好地回答了我的問題。上面的代碼遺漏了在調用write之前,調用readReady()的三個讀操作都必須爲true,但是您對async和await的描述非常好解釋。 – TheException

+0

我更新了我的代碼示例。我不確定您還需要更新哪些內容,但如果需要,我很樂意添加清晰度? –