Tag: async await

entity framework6异步操作和TranscationScope

我在stackoverflow上搜索但找不到类似的问题,请指出我是否已经有一个问题。 我试图用同步和异步操作实现一个通用的可重用存储库,但是我对entity framework和工作单元的了解很少,我很难找到实现它的正确方法。 我在SaveAndCommit操作中添加了一些变体,但不知道使用事务和异步执行此操作的最佳方法是什么。 – – 编辑 – – 根据我的理解,当执行多个操作时应该使用事务,但出于理解的目的,我将它用于一个操作。 (如果我错了,请纠正我) 这是我到目前为止所做的 public class Service : IService where TEntity : Entity { #region Constructor and Properties UnitOfWork _unitOfWork { get { return UnitOfWork.UnitOfWorkPerHttpRequest; } } protected DbSet Entities { get { return _unitOfWork.Set(); } } #endregion Constructor and Properties #region Operations public virtual IQueryable QueryableEntities() […]

抛出特定exception时,SmtpClient.SendMailAsync会导致死锁

我正在尝试基于VS2013项目模板中的示例AccountController为ASP.NET MVC5网站设置电子邮件确认。 我已经使用SmtpClient实现了IIdentityMessageService ,试图让它尽可能简单: public class EmailService : IIdentityMessageService { public async Task SendAsync(IdentityMessage message) { using(var client = new SmtpClient()) { var mailMessage = new MailMessage(“some.guy@company.com”, message.Destination, message.Subject, message.Body); await client.SendMailAsync(mailMessage); } } } 调用它的控制器代码直接来自模板(由于我想排除其他可能的原因,因此将其解压缩为单独的操作): public async Task TestAsyncEmail() { Guid userId = User.Identity.GetUserId(); string code = await UserManager.GenerateEmailConfirmationTokenAsync(userId); var callbackUrl = Url.Action(“ConfirmEmail”, “Account”, […]

如何从.NET 4.5中的并行任务中获益

我想使用.NET迭代器和并行Tasks / await?。 像这样的东西: IEnumerable Foo(IEnumerable source) { Parallel.ForEach( source, s=> { // Ordering is NOT important // items can be yielded as soon as they are done yield return ExecuteOrDownloadSomething(s); } } 不幸的是.NET无法原生地处理这个问题。 迄今为止@svick的最佳答案 – 使用AsParallel()。 奖励:任何实现多个发布者和单个订阅者的简单异步/等待代码? 订阅者将屈服,并且pubs将处理。 (仅核心库)

Task.WhenAny和Unobserved Exceptions

假设我有三个任务, a , b和c 。 这三个都保证在1到5秒之间的随机时间抛出exception。 然后我写下面的代码: await Task.WhenAny(a, b, c); 这将最终从任何一个任务故障中抛出exception。 由于没有try…catch这里,这个例外会冒泡到我的代码中的其他地方。 剩下的两个任务抛出exception会发生什么? 是不是这些未被观察到的exception,这将导致整个过程被杀死? 这是否意味着使用WhenAny的唯一方法是在try…catch块中,然后在继续之前以某种方式观察剩余的两个任务? 后续行动:我希望将答案同时应用于.NET 4.5 和 .NET 4.0以及Async Targeting Pack(尽管在这种情况下显然使用了TaskEx.WhenAny )。

如何获取使用SynchronizationContext的任务? 那么SynchronizationContext是如何使用的呢?

我还在学习整个任务概念和TPL。 根据我目前的理解, await使用SynchronizationContext函数(如果存在)来“调用”任务“某处”。 另一方面, Task类中的函数不使用上下文,对吧? 因此,例如, Task.Run(…)将始终在线程池的工作线程上调度操作,并完全忽略SynchronizationContext.Current 。 await Foobar()会在await之后使用上下文来执行生成的任务吗? 如果这是真的,我的问题是:我如何获得一个实际运行动作但使用SynchronizationContext.Current.Send/Post调度的Task ? 任何人都可以推荐对SynchronizationContext一个很好的介绍,特别是在框架的其余部分何时以及如何使用它们的时候? MSDN似乎对这堂课非常安静。 顶级Google点击( 此处和此处 )似乎仅适用于Windows Forms调度。 Stephen Cleary撰写了一篇文章 ,很好地了解了已经存在的背景以及它们是如何工作的,但是我不了解实际使用它们的位置和时间。

正确使用HttpContext.Current.User与异步等待的方法

我正在使用异步操作并使用像这样的HttpContext.Current.User public class UserService : IUserService { public ILocPrincipal Current { get { return HttpContext.Current.User as ILocPrincipal; } } } public class ChannelService : IDisposable { // In the service layer public ChannelService() : this(new Entities.LocDbContext(), new UserService()) { } public ChannelService(Entities.LocDbContext locDbContext, IUserService userService) { this.LocDbContext = locDbContext; this.UserService = userService; } public async […]

拦截异步方法,通过DynamicProxy返回通用Task

我的问题与这篇文章有关拦截使用DynamicProxy调用异步方法 我想实现拦截器,该拦截器使用返回Task或Task结果的异步方法。 我使用下一个代码返回ContinueWith结果(以便在拦截器完成工作时调用方法等待) var task = invocation.ReturnValue as Task; invocation.ReturnValue = task.ContinueWith(c => { code that should execute after method finish }); 上面的代码适用于Task结果,但是在Task结果的情况下, ContinueWith会将返回类型从Task更改为Task 。 我需要调用重载方法ContinueWith返回Task ,但为此我需要将invocation.ReturnValue为Task 我没有找到以任何方式动态投射它的方法。 有谁知道如何制作它? 我也尝试通过reflection调用此方法,但参数是labmda函数,不能直接传递。

以非阻塞方式调用TaskCompletionSource.SetResult

我发现了TaskCompletionSource.SetResult(); 在返回之前调用等待任务的代码。 在我的情况下,导致死锁。 这是一个在普通Thread启动的简化版本 void ReceiverRun() while (true) { var msg = ReadNextMessage(); TaskCompletionSource task = requests[msg.RequestID]; if(msg.Error == null) task.SetResult(msg); else task.SetException(new Exception(msg.Error)); } } 代码的“异步”部分看起来像这样。 await SendAwaitResponse(“first message”); SendAwaitResponse(“second message”).Wait(); Wait实际上嵌套在非异步调用中。 SendAwaitResponse(简化) public static Task SendAwaitResponse(string msg) { var t = new TaskCompletionSource(); requests.Add(GetID(msg), t); stream.Write(msg); return t.Task; } 我的假设是第二个SendAwaitResponse将在ThreadPool线程中执行,但它会在为ReceiverRun创建的线程中继续。 无论如何设置任务的结果而不继续等待代码? 该应用程序是一个控制台应用程

async / await关键字在.net 4.0中不可用

我想在C#4.0中使用async / await,我已经安装了以下软件包: http://www.nuget.org/packages/Microsoft.Bcl.Async/ 问题是我没有async / await关键字可用。 我正在使用带有SP1的VS2010。 谢谢。

Oracle托管驱动程序可以正确使用异步/等待吗?

我试图使用async / wait .NETfunction进行Oracle查询。 结果集相当大,大约需要5-10秒才能恢复。 Window_Loaded挂起了UI线程,本质上我想使用async / wait在后台执行查询,然后使用结果更新数据视图。 这是Oracle驱动程序问题还是代码错误? 例如,这是同步而不是异步完成的事情吗? 我正在使用Oracle可以从Oracle网站获得的最新Oracle.ManagedDataAccess 。 async Task AccessOracleAsync() { DataTable dt; using(OracleConnection conn = new OracleConnection(ConfigurationManager.ConnectionStrings[“connStr”].ConnectionString)) using (OracleCommand cmd = new OracleCommand(@”SELECT * FROM myTbl”, conn)) { await conn.OpenAsync(); using (var reader = await cmd.ExecuteReaderAsync()) { dt = new DataTable(); dt.Load(reader); } } return dt; } private async […]