Questions tagged «async-await»

这涵盖了使用async和await关键字的各种编程语言支持的异步编程模型。

20
在forEach循环中使用异步/等待
在循环中使用async/ 是否有任何问题?我试图遍历文件数组和每个文件的内容。awaitforEachawait import fs from 'fs-promise' async function printFiles () { const files = await getFilePaths() // Assume this works fine files.forEach(async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) }) } printFiles() 这段代码确实有效,但是这可能出问题吗?我让某人告诉我,您不应该在这样的高阶函数中使用async/ await,所以我只是想问一下这是否有问题。

21
如何以及何时使用“异步”和“等待”
根据我的理解async,await要做的主要事情之一就是使代码易于编写和阅读-但是使用它们是否等同于产生后台线程来执行长时间逻辑? 我目前正在尝试最基本的示例。我在行中添加了一些评论。你能为我澄清一下吗? // I don't understand why this method must be marked as `async`. private async void button1_Click(object sender, EventArgs e) { Task<int> access = DoSomethingAsync(); // task independent stuff here // this line is reached after the 5 seconds sleep from // DoSomethingAsync() method. Shouldn't it be reached immediately? …

16
如何在C#中从同步方法调用异步方法?
我有一个public async void Foo()要从同步方法调用的方法。到目前为止,我从MSDN文档中看到的所有内容都是通过异步方法调用异步方法,但是我的整个程序不是使用异步方法构建的。 这有可能吗? 这是从异步方法调用这些方法的一个示例:http : //msdn.microsoft.com/zh-cn/library/hh300224(v=vs.110).aspx 现在,我正在研究从同步方法调用这些异步方法。
861 c#  async-await 

24
如何同步运行异步Task <T>方法?
我正在学习异步/等待,并遇到需要同步调用异步方法的情况。我怎样才能做到这一点? 异步方法: public async Task&lt;Customers&gt; GetCustomers() { return await Service.GetCustomersAsync(); } 正常用法: public async void GetCustomers() { customerList = await GetCustomers(); } 我尝试使用以下方法: Task&lt;Customer&gt; task = GetCustomers(); task.Wait() Task&lt;Customer&gt; task = GetCustomers(); task.RunSynchronously(); Task&lt;Customer&gt; task = GetCustomers(); while(task.Status != TaskStatus.RanToCompletion) 我也从这里尝试了一个建议,但是当调度程序处于挂起状态时,它不起作用。 public static void WaitWithPumping(this Task task) { if (task …

4
调用ConfigureAwait获取所有服务器端代码的最佳实践
当您拥有服务器端代码(即某些代码ApiController)并且您的函数是异步的(因此它们返回)Task&lt;SomeObject&gt;时,是否在任何时候都等待调用的函数是否被视为最佳实践ConfigureAwait(false)? 我已经读到它具有更高的性能,因为它不必将线程上下文切换回原始线程上下文。但是,对于ASP.NET Web Api,如果您的请求是在一个线程上传入的,并且您等待某个函数并调用ConfigureAwait(false),则在返回ApiController函数的最终结果时,该函数可能会将您置于另一个线程上。 我在下面输入了一个我正在谈论的例子: public class CustomerController : ApiController { public async Task&lt;Customer&gt; Get(int id) { // you are on a particular thread here var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false); // now you are on a different thread! will that cause problems? return customer; } }


9
如果我的界面必须返回Task,那么执行无操作实现的最佳方法是什么?
在下面的代码中,由于接口的原因,该类LazyBar必须从其方法中返回一个任务(出于参数的考虑,不能更改)。如果LazyBars实现不寻常,因为它恰巧可以快速且同步地运行,那么从该方法返回No-Operation任务的最佳方法是什么? 我已经跟Task.Delay(0)下面,但是我想知道这是否有任何性能的副作用,如果该功能被称为很多(为了讨论各种情形,说上百次),: 这种语法糖是否会发展成大事? 它会开始阻塞我的应用程序的线程池吗? 编译器切割器是否足以应付Delay(0)不同要求? 请问return Task.Run(() =&gt; { });有什么不同? 有没有更好的办法? using System.Threading.Tasks; namespace MyAsyncTest { internal interface IFooFace { Task WillBeLongRunningAsyncInTheMajorityOfImplementations(); } /// &lt;summary&gt; /// An implementation, that unlike most cases, will not have a long-running /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations' /// &lt;/summary&gt; internal class LazyBar : IFooFace { #region …

5
对多个任务使用异步/等待
我使用的是完全异步的API客户端,也就是说,每个操作要么返回Task要么Task&lt;T&gt;,例如: static async Task DoSomething(int siteId, int postId, IBlogClient client) { await client.DeletePost(siteId, postId); // call API client Console.WriteLine("Deleted post {0}.", siteId); } 使用C#5 async / await运算符,启动多个任务并等待所有任务完成的正确/最有效方法是什么: int[] ids = new[] { 1, 2, 3, 4, 5 }; Parallel.ForEach(ids, i =&gt; DoSomething(1, i, blogClient).Wait()); 要么: int[] ids = new[] { …

8
为什么不能在lock语句的主体内使用'await'运算符?
锁定语句中不允许使用C#(.NET Async CTP)中的await关键字。 从MSDN: 等待表达式不能用于同步函数,查询表达式,异常处理语句的catch或finally块,锁语句的块或不安全的上下文中。 我认为由于某种原因,对于编译器团队而言,这既困难又不可能。 我尝试了using语句: class Async { public static async Task&lt;IDisposable&gt; Lock(object obj) { while (!Monitor.TryEnter(obj)) await TaskEx.Yield(); return new ExitDisposable(obj); } private class ExitDisposable : IDisposable { private readonly object obj; public ExitDisposable(object obj) { this.obj = obj; } public void Dispose() { Monitor.Exit(this.obj); } } …
348 c#  .net  async-await 



11
如何在不等待的情况下安全地在C#中调用异步方法
我有一个async不返回任何数据的方法: public async Task MyAsyncMethod() { // do some stuff async, don't return any data } 我从另一个返回一些数据的方法中调用此方法: public string GetStringData() { MyAsyncMethod(); // this generates a warning and swallows exceptions return "hello world"; } 在MyAsyncMethod()不等待的情况下进行调用会在Visual Studio中引发“ 由于未等待此调用,因此当前方法会在调用完成之前继续运行 ”警告。在该警告的页面上,它指出: 仅当您确定不想等待异步调用完成并且被调用的方法不会引发任何异常时,才应考虑禁止显示警告。 我确定我不想等待通话结束。我不需要或没有时间。但是通话可能会引发异常。 我已经几次遇到这个问题,并且我确定这是一个常见的问题,必须有一个通用的解决方案。 如何安全地调用异步方法而不等待结果? 更新: 对于建议我只是等待结果的人们,这是响应我们Web服务(ASP.NET Web API)上的Web请求的代码。在UI上下文中等待将保持UI线程空闲,但是在Web请求调用中等待将等待Task完成,然后再响应请求,从而无故增加了响应时间。

4
同步等待异步操作,为什么Wait()在这里冻结程序
前言:我在寻找一个解释,而不仅仅是一个解决方案。我已经知道了解决方案。 尽管花了几天时间研究有关基于任务的异步模式(TAP),异步和等待的MSDN文章,但我对某些更详细的信息仍然感到困惑。 我正在为Windows Store Apps编写记录器,并且希望同时支持异步和同步记录。异步方法遵循TAP,同步方法应隐藏所有这些内容,并且外观和工作方式与普通方法类似。 这是异步日志记录的核心方法: private async Task WriteToLogAsync(string text) { StorageFolder folder = ApplicationData.Current.LocalFolder; StorageFile file = await folder.CreateFileAsync("log.log", CreationCollisionOption.OpenIfExists); await FileIO.AppendTextAsync(file, text, Windows.Storage.Streams.UnicodeEncoding.Utf8); } 现在对应的同步方法... 版本1: private void WriteToLog(string text) { Task task = WriteToLogAsync(text); task.Wait(); } 看起来正确,但是不起作用。整个程序永久冻结。 版本2: 嗯..也许任务没有开始? private void WriteToLog(string text) { Task task …

2
何时正确使用Task.Run以及何时仅异步等待
我想问您关于何时使用正确的体系结构的意见Task.Run。我在WPF .NET 4.5应用程序(使用Caliburn Micro框架)中遇到了滞后的UI。 基本上我在做(非常简化的代码片段): public class PageViewModel : IHandle&lt;SomeMessage&gt; { ... public async void Handle(SomeMessage message) { ShowLoadingAnimation(); // Makes UI very laggy, but still not dead await this.contentLoader.LoadContentAsync(); HideLoadingAnimation(); } } public class ContentLoader { public async Task LoadContentAsync() { await DoCpuBoundWorkAsync(); await DoIoBoundWorkAsync(); await DoCpuBoundWorkAsync(); // I …

6
使用await / async时,HttpClient.GetAsync(...)从不返回
编辑: 这个问题看起来可能是相同的问题,但没有任何响应... 编辑:在测试用例5中,任务似乎停留在WaitingForActivation状态中。 我在.NET 4.5中使用System.Net.Http.HttpClient遇到了一些奇怪的行为-“等待”调用(例如)的结果httpClient.GetAsync(...)将永远不会返回。 仅在使用新的异步/等待语言功能和Tasks API的某些情况下会发生这种情况-仅使用延续时,代码似乎总是可以工作。 这是重现问题的一些代码-将其放入Visual Studio 11中的新“ MVC 4 WebApi项目”中,以暴露以下GET端点: /api/test1 /api/test2 /api/test3 /api/test4 /api/test5 &lt;--- never completes /api/test6 此处的每个端点都返回相同的数据(来自stackoverflow.com的响应头),但/api/test5永远不会完成。 我是否在HttpClient类中遇到错误,还是我在某种程度上滥用了API? 复制代码: public class BaseApiController : ApiController { /// &lt;summary&gt; /// Retrieves data using continuations /// &lt;/summary&gt; protected Task&lt;string&gt; Continuations_GetSomeDataAsync() { var httpClient = new HttpClient(); var …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.