停止此异步函数调用,只返回简单值

时间:2016-12-10 18:14:17

标签: c# async-await

我只想从一个函数返回一个字符串,我需要在windows phone环境中进行api调用。我不想要返回一个Task,只是一个字符串。

我根本不知道如何从函数中获取值而不总是在我调用应该简单执行的函数的确切位置使用await(这使得整个async / await事情变得毫无意义)。

请解释我如何得到这样的东西:

DLWLALDYVASQASV

3 个答案:

答案 0 :(得分:1)

对不起,我要给你一个“爱情”#34;答案。

  

我只想从一个函数返回一个字符串,我需要在windows phone环境中进行api调用。我不想要返回一个Task,只是一个字符串。

太糟糕了。 正确的解决方案是在移动平台上返回Task<string> ,尤其是 。任何其他解决方案都将成为一个黑客。

  

我根本不知道如何从函数中获取值而不总是在我调用应该简单执行的函数的确切位置使用await(这使得整个异步/等待事情变得毫无意义)。

根本不是毫无意义的。 async / await可以让您的UI保持响应。这是必要的,您的应用程序可以在Windows应用商店中接受。

答案 1 :(得分:0)

假设您正在尝试所有返回任务的函数,您只需执行此操作:

var result = LoadDataAsync().GetAwaiter().GetResult();

当然,这并不是强制该方法同步运行,而是告诉编译器您要等到异步任务完成然后返回结果。它在功能上等同于

var result = await LoadDataAsync();

所有这些语法都允许您跳过使用async关键字注释方法。你需要等待一种方式。如果您正在调用一个异步运行的方法,并且您需要做一些事情来等待该函数完成并将数据返回给您,否则您将获得错误的数据。

答案 2 :(得分:0)

请注意,当您对异步方法(通过Wait()或.Result)进行阻塞调用时,如果调用方法的SynchronizationContext不为null,则存在导致死锁的风险。因为异步方法将尝试在调用方法的同步上下文中调度其继续,但调用方法在异步方法完成时阻塞,因此您最终处于死锁状态。

保证没有死锁的一种方法是将此异步调用推送到后台线程,即。通过Task.Run。后台线程没有SynchronizationContext,因此没有死锁。

类似的东西:

var result = Task.Run(async() => await LoadDataAsync()).Result;

PS。您不需要在Result属性之前调用Wait()。结果将阻止线程,直到任务完成。