Tag: async await

如何回答请求但继续在WebApi中处理代码

我想回答一个请求,但继续处理代码。 我试过类似的东西: [HttpPost] public async Task SendAsync(MyRequest sms) { await Task.Run(() => Process(sms)); //need to run in a separate thread var response = new MyRequest(sms) { Ack = true }; return Request.CreateResponse(HttpStatusCode.Created, response.ToString()); } private async void Process(MyRequest sms) { var validationResult = new MyRequestValidation(_p2pContext, _carrierService).Validate(sms); if (string.IsNullOrWhiteSpace(validationResult.Errors[0].PropertyName)) // Request not valid return; Message msg; […]

为什么等待不会出现阻止EF上下文的第二次操作

在ASP.NET MVC应用程序中,我收到了一个使用我的Entity Framework上下文的控制器方法的以下错误消息。 在先前的异步操作完成之前,在该上下文上开始第二个操作。 使用’await’确保在此上下文上调用另一个方法之前已完成任何异步操作。 任何实例成员都不保证是线程安全的。 我知道你不能并行运行查询,所有东西似乎都在等待。 如果我调试程序并逐步检查从EF返回的一些数据,那么它可以工作,可能是因为这会强制查询完成。 编辑如果我在控制器方法的空检查中放置一个断点并检查shipmentDetail的数据,则不会抛出exception。 这是代码的一部分: 控制器方法 : [Route(“{id:int}/Deliveries”)] public async Task DeliveryInfo(int id) { var shipmentDetail = await db.ShipmentDetails.SingleOrDefaultAsync(s => s.Id == id); if (shipmentDetail == null) return HttpNotFound(string.Format(“No shipment detail found with id {0}”, id)); var model = await DeliveryInfoModel.CreateModel(db, shipmentDetail); return View(“DeliveryInfo”, model); } CreateModel方法 : public static […]

如何更好地理解“异步 – 处理多个exception”一文中的代码/语句?

运行以下C#控制台应用程序 class Program { static void Main(string[] args) { Tst(); Console.ReadLine(); } async static Task Tst() { try { await Task.Factory.StartNew (() => { Task.Factory.StartNew (() => { throw new NullReferenceException(); } , TaskCreationOptions.AttachedToParent ); Task.Factory.StartNew ( () => { throw new ArgumentException(); } ,TaskCreationOptions.AttachedToParent ); } ); } catch (AggregateException ex) { // this […]

无法理解异步并等待

我一直在尝试理解as#/ await和C#中的任务,但是尽管观看了YouTubevideo,阅读文档和遵循复数课程,但仍然失败了。 我希望有人能够帮助回答这些略微抽象的问题,以帮助我的大脑。 1.为什么他们说async / await在它自己的async关键字什么都不做而且await关键字添加一个暂停点时启用’asynchonrous’方法? 没有添加一个暂停点,强制该方法同步动作,即在继续之前完成await标记的任务。 2.显然除了事件处理程序之外你不应该使用async void,那么你如何正常调用异步方法呢? 似乎为了使用await关键字调用异步方法,调用它本身的方法/类需要标记为async。 我见过的所有例子都“启动”了一个带有事件处理程序的异步void方法。 你将如何“逃避”async / await的包装以运行该方法? 3。 public async Task SaveScreenshot(string filename, IWebDriver driver) { var screenshot = driver.TakeScreenshot(); await Task.Run(() => { Thread.Sleep(2000); screenshot.SaveAsFile(filename, ScreenshotImageFormat.Bmp); Console.WriteLine(“Screenshot saved”); }); Console.WriteLine(“End of method”); } 回到1.这看起来像一个同步方法。 当它到达Task.Run时执行暂停,因此Console.WriteLine(“End of method”); 在任务完成之前不会执行。 也许整个方法本身将在代码中触发它时异步执行? 但回到2,你需要等待调用它,否则你得到消息’因为没有等待这个调用..’因此添加await将导致该执行点同步等等。 任何帮助理解这一点将非常感激。

异步/等待执行差异

我正在努力掌握异步/等待,我想澄清一些混乱。 有人可以解释以下执行方面的差异: // version 1 public Task Copy(string source, string destination) { return Task.Run(() => File.Copy(source, destination)); } public async Task Test() { await Copy(“test”, “test2”); // do other stuff } 和: // version 2 public async Task Copy(string source, string destination) { await Task.Run(() => File.Copy(source, destination)); } public async Task Test() { await […]

如果引发任何exception,如何在Task.WhenAll上取消并引发exception?

我正在使用Task.WhenAll等待倍数任务。 当其中一个生成exception时,我希望Task.WhenAll(或任何其他等待多个任务的方式)立即取消其他任务并引发exception。 可能吗? 提前致谢

Async和Await与HttpWebRequest.GetResponseAsync

我正在尝试在发出Web请求时使用Async和Await,并且发现它永远不会超过await行。 我是通过Metro应用程序执行此操作,但我也在winforms应用程序中validation了该问题。 public async Task DoSomething() { string url = “http://imgur.com/gallery/VcBfl.json”; HttpWebRequest request = HttpWebRequest.CreateHttp(url); var ws = await request.GetResponseAsync(); return ws.ResponseUri.ToString(); ; } 如果我不使用await而是执行同步等待,它可以工作,但我需要它以异步方式运行。 我在这段代码中遗漏了什么导致await永不返回?

我在使用FileStream.ReadAsync()时应该以异步模式打开文件吗?

为FileStream执行异步I / O的旧.Net方法是使用FileStream.BeginRead()和FileStream.EndRead() 。 FileStream.BeginRead()的MSDN文档指出: FileStream提供两种不同的操作模式:同步I / O和异步I / O. 虽然可以使用其中任何一种,但底层操作系统资源可能仅允许以这些模式之一进行访问。 默认情况下,FileStream会同步打开操作系统句柄。 在Windows中,这会降低异步方法的速度。 如果使用异步方法,请使用FileStream(String,FileMode,FileAccess,FileShare,Int32,Boolean)构造函数。 为FileStream执行异步I / O的.Net 4.5x方法是使用Stream.ReadAsync() 。 FileStream.ReadAsync()的MSDN文档直接链接到Stream.ReadAsync()的文档。 本文档未提及是否需要以异步模式打开文件; 实际上,文档中的示例代码显然不会这样做。 因此,我假设在使用File.ReadAsync() ,无需以异步模式打开文件。 这个假设是否正确? [编辑] 我刚刚发现了一篇关于使用Async for File Access的MSDN文章 。 这表明: 本主题中的示例使用FileStream类,该类具有导致在操作系统级别发生异步I / O的选项。 通过使用此选项,您可以避免在许多情况下阻止ThreadPool线程。 要启用此选项,请在构造函数调用中指定useAsync = true或options = FileOptions.Asynchronous参数。 所以现在我认为我应该以异步模式打开文件…如果是这样,有点不幸的是, ReadAsync()文档中提供的示例代码不会异步打开文件!

并行循环调用中的进度条

我试图在multithreading环境中更新进度条。 我知道很多问题已经解决了这个问题,但提议的解决方案都没有对我有用。 这是我的代码的主干: public static void DO_Computation(//parameters) { //Intialisation of parameters Parallel.For(struct initialisation with local data) { //business logic //Call to update_progressbar (located in an another class, as the DO_Computation function is in Computation.cs class (not deriving from Form). WinForm.Invoke((Action)delegate {Update_Progress_Bar(i);}); //WinForm is a class that exposes the progressbar. } } 这不起作用(进度条在达到100%时冻结,这是正常的(我们可以参考这个问题的微软文章 (事实上​​,这不是一个线程安全的操作方法)。)Microsoft网站stiraptes to wrap […]

尝试Catch以外:await Task.Run(()

尝试在外面捕获: await Task.Run(() =>有意义还是只在await中使用它们? private async void Test() { try { await Task.Run(() => { try { DoingSomething(); } catch (Exception ex) { log.Error(ex.Message); } }); } catch (Exception ex) { log.Error(ex.Message); } }