链接异步方法

时间:2017-10-25 13:19:43

标签: c# asynchronous

我有类似下面的内容。所以每个值都取决于另一个:

var valueX = methodX();
var valueY = methodDependingOnX(valueX);
var valueZ = methodDependingOnY(valueY);
// More code here

我想知道如何以异步方式处理它,以保持UI响应? 这是我的真实代码:

Parser parser = new Parser();
LinqQueryManager linq = new LinqQueryManager();
ExcelManager manager = new ExcelManager();

//this return the path of the xml file created
string xmlPreviousCreated = Parser.GenerateXMLDBAsync(file1.FilePath, xmlFile1.FilePath, "Previous");

//now previous depends on the xml file created
List<ExcelBlock> previous = linq.GetListofBlocks(xmlPreviousCreated, xmlFile1.FilePath);

//the same with the next two variables
string xmlCurrentCreated = parser.GenerateXMLDBAsync(file2.FilePath, xmlFile2.FilePath, "Current");

List<ExcelBlock> current = linq.GetListofBlocks(xmlCurrentCreated, xmlFile2.FilePath);
//finally this depends on the previous vars
manager.CreateExcelFile(previous, current);

我正试图以某种方式调用方法,以便UI保持响应。因为创建xml文件的方法需要一段时间。我有两种方法可以创建xml文件,另外两种方法可以查询它们。我想要的是以有效的方式做到这一点,但我不确定我是否可以使用并行或asyn编程。这是第一次处理它

1 个答案:

答案 0 :(得分:0)

根据所涉及方法的签名,有几种方法可以做到这一点。

如果这些方法中的每一个都已经异步/等待就绪,即返回Task,那么这很简单

var valueX = await methodX();
var valueY = await methodDependingOnX(valueX);
var valueZ = await methodDependingOnY(valueY);
// More code here

假设方法签名类似于

public Task<string> methodX();

如果不是,你也会考虑包装上述电话。

var result = await Task.Run(() => {
    var valueX = methodX();
    var valueY = methodDependingOnX(valueX);
    var valueZ = methodDependingOnY(valueY);
    return valueZ;
});
// More code here