2016-08-04 121 views
0

我有一個異步方法,它從MySql服務器查詢數據並將它們寫入txt文件中。 (我沒有找到從異步方法返回字符串的方法)。先後調用異步方法和同步方法

然後,我必須調用一個簡單的同步方法來讀取txt文件。

我的代碼如下所示:

var sql = new ProjetTN.Class.SQLite(); 
sql.GetSens("101"); //<--- This is an async method 

var SensItems = sql.ListeSens(); //<--- This method return a List<string> 

但如果我喜歡運行的代碼,異步方法將被跳過,不會寫txt文件。之後,同步方法將嘗試讀取txt文件,但他不存在,所以程序將崩潰。

在我的研究,我發現,我需要等待異步方法是完整的,所以我嘗試:

public void CallGetSens() 
{ 
    var task = GetSens("101"); 
    task.Wait(); 
} 

當我調用的方法:

var sql = new ProjetTN.Class.SQLite(); 
sql.CallGetSens(); //<--- This is an async method 

var SensItems = sql.ListeSens(); //<--- This method return a List<string> 

但這只是凍結程序...

那麼我怎麼能連續調用異步方法然後同步方法? 否則,我怎樣才能從異步方法返回一個字符串?

+5

我建議你做的異步/ AWAIT一些閱讀。 –

+0

@CharlesMager你對我的建議有什麼看法? :) –

+0

對於初學者:[使用異步和等待的異步編程](https://msdn.microsoft.com/en-us/library/mt674882.aspx)。另外[控制異步程序中的流程](https://msdn.microsoft.com/zh-cn/library/mt674892.aspx) – Igor

回答

2

最好的辦法通常是使正在做的調用方法是async這樣就可以await異步調用:

async Task MyMethod() 
{ 
    var sql = new ProjetTN.Class.SQLite(); 
    await sql.CallGetSens(); 

    var SensItems = sql.ListeSens(); 
    ... 
} 

如果不會出於某種原因,你可以使用.ContinueWith()來使數據從文本文件裝載發生後,文件已保存:

var sql = new ProjetTN.Class.SQLite(); 
sql.CallGetSens().ContinueWith(t => { 
    var SensItems = sql.ListeSens(); 
    ... 
}); 
0

你可以讓你async操作sync運用asyncawait方法

link有詳細討論一下

也看到這兩計算器問題

問題One和問題 Two