Tag: 异步

entity framework6.1.0 SaveChangesAsync

我有EF助手类保存更改异步: public async Task SaveOrUpdateAsync(TEntity entity) where TEntity : class, IContextEntity { if (entity.Id == 0) context.Set().Add(entity); else { TEntity dbEntry = context.Set().Find(entity.Id); if (dbEntry != null) dbEntry = entity; } return await context.SaveChangesAsync(); } public void Save() { Task saveEntit1Async = repository.SaveOrUpdateAsync(entity1); Task saveEntity2Async = repository.SaveOrUpdateAsync(entity2); Task saveEntity3Async = repository.SaveOrUpdateAsync(Entity3); Task.WaitAll(saveEntit1Async, saveEntity2Async, saveEntity3Async); string […]

ASP.NET长时间运行的任务。 线程正在中止exception

ASP.NET 3.5 webapp必须启动几个需要几个小时才能完成的任务。 出于显而易见的原因,启动这些任务的页面不能等待它们完成,也不会有任何人想要等待那么长时间来获得响应,因此任务必须是异步的。 有一个Helper类来处理所有这些长时间运行的任务。 调度和执行这些任务的主要方法目前如下: public static bool ScheduleTask(TaskDescriptor task, Action action) { bool notAlreadyRunning = TasksAsync.TryAdd(task); if (notAlreadyRunning) { Thread worker = null; worker = new Thread(() => { try { action(); } catch(Exception e) { Log.LogException(e, “Worker”); } TasksAsync.RemoveTask(task); workers.Remove(worker); }); workers.Add(worker); worker.Start(); } return notAlreadyRunning; } 在早期的实现中,我们使用了ThreadPool.QueueUserWorkItem方法,但结果始终是相同的:在aprox之后。 20-30分钟一个线程被中止exception被抛出。 有谁知道为什么会这样? 或者如何预防? 更多信息: […]

使用TPL实现经典异步模式

我正在尝试为WF 4实现自定义TrackingParticipant。我可以编写Track方法,但我的实现速度很慢。 如何使用.NET 4.0的任务并行库(TPL)实现Begin / EndTrack覆盖? 我看过TPL和Traditional .NET异步编程,但我不知道如何在这里应用它。 请注意,TrackingParticipant是.NET的一部分,并且具有使用虚拟方法预定义的经典异步模式。 public class MyTrackingParticipant : TrackingParticipant { protected override IAsyncResult BeginTrack( TrackingRecord record, TimeSpan timeout, AsyncCallback callback, object state) { // ? } protected override void EndTrack(IAsyncResult result) { // ? } protected override void Track(TrackingRecord record, TimeSpan timeout) { // synchronous code to be called } […]

为什么一直使用Async / await

我想澄清一下使用Await和Async的额外好处是什么。 如果我的应用程序正在调用await Func1() (这里没有阻止UI)。 并且Func1正在调用等待Func2() ,但是Func2()的结果对于Func1完成它的工作很重要,那么为什么我需要使Func2()等待。 Func1()执行将花费同样长的时间,因为它正在等待Func2完成。 await所做的就是添加StateMachine开销。 我在这里错过了什么吗?

在异步任务中使用HttpContext

我有以下mvc动作。 public async Task DoSomeLongRunningOperation() { return await Task.Run(() => { //Do a lot of long running stuff //The underlying framework uses the HttpContext.Current.User.Identity.Name so the user is passed on the messagebus. } } 在任务中,HttpContext变为null。 我们做了很多尝试,但没有任何事情让我们确信HttpContext总是在我们的新线程中可用。 有没有在异步任务中使用HttpContext的解决方案? 在我们的Io​​cContainer中,我们注册了以下对象,该对象将用户名传递给框架。 public class HttpContextUserIdentityName : ICredentials { public string Name { get { return HttpContext.Current.User.Identity.Name; } } } […]

我可以等待我用发电机创建的可枚举数吗?

假设我有异步获得的整数序列。 async Task GetI(int i){ return await Task.Delay(1000).ContinueWith(x => i); } 我想在该序列上创建一个生成器,如果序列是同步的,我会这样做: IEnumerable Method() { for (var i = 0; i < 100; i++) { yield return GetI(i); // won't work, since getI returns a task } } 所以,我认为类比是让生成器异步并从中产生: async Task<IEnumerable> Method() { for (var i = 0; i i); } } 这不起作用,因为带有yield的方法必须返回一个IEnumerable的东西,替代方案,更有意义的是IEnumerable<Task>但由于async方法必须返回Task s或void,因此无法编译。 现在,我意识到我可以简单地删除await并返回一个IEnumerable<Task>但这对我没有帮助,因为迭代会在任何数据准备就绪之前继续询问数据,所以它不能解决我的问题。 […]

使用Task.Delay()的成本是多少?

我正在考虑在具有事件驱动逻辑的MMO游戏服务器中使用C#async \ await。 让我们假设有数千个实体在已知持续时间内完成一些工作。 所以我想为每个游戏对象调用Time.Delay() 。 (这是对每个游戏对象进行一些Update()调用的常见无限循环的对立方法。) 有谁知道Task.Delay()是如何实现的? 它是否使用计时器? 系统资源是否很重? 是否可以产生数千个同时Task.Delay()调用?

如何正确地进行异步/并行数据库调用

我正在寻找处理多个数据库调用的正确方法,这些调用可能会同时运行。 查询仅针对使用在ASP.NET MVC应用程序中以编程方式组装到DataTable中的数据进行插入或合并的存储过程。 当然我已经看到了关于async和await一些信息,这似乎是我需要做的,但我对如何实现它没有清楚的理解。 一些信息表明这些调用仍然是顺序调用的,并且仍然会等待另一个调用完成。 这似乎毫无意义。 最后,我想要一个解决方案,允许我在完成最长程序所需的时间内运行所有查询。 我希望所有查询都能返回受影响的记录数(就像现在一样)。 这就是我现在要做的事情(这绝不是平行的): // Variable for number of records affected var recordedStatistics = new Dictionary(); // Connect to the database and run the update procedure using (var dbc = new SqlConnection(db.Database.Connection.ConnectionString)) { dbc.Open(); // Merge One procedure using (SqlCommand cmd = new SqlCommand(“MergeOneProcedure”, dbc)) { // 5 minute timeout […]

使用进度从FTP下载文件 – TotalBytesToReceive始终为-1?

我正在尝试从带有进度条的FTP服务器下载文件。 文件正在下载,并且ProgressChanged事件正在调用,除非事件args TotalBytesToReceive始终为-1。 TotalBytes增加,但我无法计算没有总数的百分比。 我想我可以通过其他ftp命令找到文件大小,但我想知道为什么这不起作用? 我的代码: FTPClient request = new FTPClient(); request.Credentials = credentials; request.DownloadProgressChanged += new DownloadProgressChangedEventHandler(request_DownloadProgressChanged); //request.DownloadDataCompleted += new DownloadDataCompletedEventHandler(request_DownloadDataCompleted); request.DownloadDataAsync(new Uri(folder + file)); while (request.IsBusy) ; …. static void request_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { if (e.TotalBytesToReceive == -1) { l.reportProgress(-1, FormatBytes(e.BytesReceived) + ” out of ?” ); } else { l.reportProgress(e.ProgressPercentage, “Downloaded […]

在任务中将TResult转换为System.Object

我正在加载一个程序集并调用一个静态方法,该方法将使用MethodInfo.Invoke()通过reflection创建一个类型为“MyClass1”的新对象(此类型在运行时指定)。 当方法是普通同步方法时,这可以正常工作。 但是,被调用的方法是一个异步方法,它返回Task ,它将用于使用task.Result检索结果。 理想情况下,我应该在任务中使用MyClass1作为TResult,但类型仅在运行时确定,所以我不能这样做。 我正在寻找一种方法来获得任务和结果。 我试图将TResult转换为System.Object并将该类作为通用对象。 以下是我为此目的使用的代码。 public static void LoadAssembly() { // Calling static async method directly works fine Task task1 = MyClass1.MakeMyClass1(); MyClass1 myClass1 = task1.Result; // Calling static async method through reflection through exception. Assembly assembly = Assembly.LoadFrom(dllName); Type type = assembly.GetType(“AsyncDll.MyClass1”); var types = assembly.GetTypes(); MethodInfo[] methodInfos = types[0].GetMethods(BindingFlags.Public | […]