2016-08-04 161 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