Tag: asynchronous

通过工作线程的异步接口使用WCF服务,如何确保从客户端“按顺序”发送事件

我正在编写一个Silverlight类库来抽象到WCF服务的接口。 WCF服务提供集中式日志记录服务。 Silverlight类库为日志记录提供了简化的类似log4net的接口(logger.Info,logger.Warn等)。 从类库我计划提供选项,以便记录的消息可以在客户端上累积并以“突发”forms发送到WCF日志记录服务,而不是在发生时发送每条消息。 一般来说,这很有效。 类库确实累积了消息,它确实将消息集合发送到WCF日志记录服务,在这里它们由底层日志记录框架记录。 我目前的问题是消息(来自具有单个线程的单个客户端 – 所有日志记录代码都在按钮单击事件中)在日志服务中变得交错。 我意识到至少部分原因可能是由于WCF日志服务的实例化(PerCall)或同步。 但是,似乎我的消息发生得如此迅速,以至于异步调用中留下的消息的“爆发”实际上是以与生成它们不同的顺序“离开”客户端。 我试图设置一个生产者消费者队列,如此处所描述的那样稍微(或应该是“轻微的”空中引号)改变Work方法阻塞(WaitOne)直到异步调用返回(即直到执行异步回调) 。 这个想法是当一个消息突发发送到WCF日志记录服务时,队列应该等到该突发被处理后才发送下一个突发。 也许我想做的事情是不可行的,或者我正在努力解决错误的问题,(或者我可能只是不知道我在做什么!)。 无论如何,这是我的生产者/消费者队列代码: internal class ProducerConsumerQueue : IDisposable { EventWaitHandle wh = new AutoResetEvent(false); Thread worker; readonly object locker = new object(); Queue<ObservableCollection> logEventQueue = new Queue<ObservableCollection>(); LoggingService.ILoggingService loggingService; internal ProducerConsumerQueue(LoggingService.ILoggingService loggingService) { this.loggingService = loggingService; worker = new Thread(Work); worker.Start(); } […]

同步操作场景中的ExceptionFilter堆栈跟踪

我在Controller中有一个简单的同步动作,它抛出一个exception,如下所示: [RoutePrefix(“”)] public class MyController : ApiController { [Route(“”)] public HttpResponseMessage Get() { throw new Exception(“whatever”); return Request.CreateResponse(HttpStatusCode.OK, “response”); } } 我还有一个ExceptionFilterAttribute来获取应用程序中发生的exception public class MyExceptionFilterAttribute : ExceptionFilterAttribute { public override void OnException(HttpActionExecutedContext actionContext) { var ex = actionContext.Exception; // Log ex, etc. } } 一切正常,因为我确实在MyExceptionFilterAttribute获得了exception。 问题是堆栈跟踪。 这是它的样子: at System.Web.Http.Filters.ActionFilterAttribute.d__1.MoveNext() — End of stack trace from […]

实现是否会改变等待的行为?

Await关键字与等待类型一起使用(.NET附带现有的两种类型, Task和Task )。 但是,可以编写自己的等待类型。 msdn博客文章指出: 你可以想到以下代码: await FooAsync(); RestOfMethod(); 与此类似: var t = FooAsync(); var currentContext = SynchronizationContext.Current; t.ContinueWith(delegate { if (currentContext == null) RestOfMethod(); else currentContext.Post(delegate { RestOfMethod(); }, null); }, TaskScheduler.Current); 上面的(伪)代码是否遵循awaitable类型的实现(例如Task ),或者它可能只是编译器处理await关键字右侧的任何等待类型的方式? 在下面的评论部分,有一篇文章解释了TaskScheduler和SynchronizationContext之间的区别。 主要区别在于SynchronizationContext是使用委托的一般机制,而TaskScheduler特定于并且适用于任务(您可以使用TaskScheduler.FromCurrentSynchronizationContext获取包装SynchronizationContext的TaskScheduler)。 这就是为什么等待任务考虑到两者,首先检查SynchronizationContext(作为大多数UI框架支持的更一般的机制),然后回退到TaskScheduler。 等待不同类型的对象可能会选择首先使用SynchronizationContext,然后再回退到特定于该特定类型的其他某种机制。 如果我正确理解了最后一句,这意味着我可以在continueWith方法中放置我想要的任何委托(我的意思是上面代码示例中的t.ContinueWith调用),即修改await在与我的自定义等待对象一起使用时的工作方式。 万一你想了解更多: http : //blogs.msdn.com/b/pfxteam/archive/2009/09/22/9898090.aspx

为什么有些异步方法需要返回类型的Task,而有些则不需要

在Microsoft的此示例中 ,该方法的返回类型为Task 例1: async Task AccessTheWebAsync() { // You need to add a reference to System.Net.Http to declare client. HttpClient client = new HttpClient(); // GetStringAsync returns a Task. That means that when you await the // task you’ll get a string (urlContents). Task getStringTask = client.GetStringAsync(“http://msdn.microsoft.com”); // You can do work here that doesn’t […]

调用异步方法时使用.Wait()的情况是什么

我的asp.net mvc-5 Web应用程序中有以下async长时间运行方法: – public async Task ScanAsync(string FQDN) { // sample of the operation i am doing var c = await context.SingleOrDefaultAsync(a=>a.id == 1); var list = await context.Employees.ToListAsync(); await context.SaveChangesAsync(); //etc.. } 我正在使用支持运行后台作业的Hangfire工具来及时调用此异步方法,但不幸的是,hangefire工具不支持直接调用异步方法。 所以为了克服这个问题,我创建了上述方法的同步版本,如下: – public void Scan() { ScanAsync(“test”).Wait(); } 然后从HangFire调度程序我调用sync方法如下: – RecurringJob.AddOrUpdate(() => ss.Scan(), Cron.Minutely); 所以我知道使用.Wait()将主要在方法执行期间占用iis线程,但正如我所提到的,我需要这样做,因为我无法在hangefire调度程序中直接调用异步TASK。 那么当我使用.Wait()调用异步方法时会发生什么?整个方法的操作是否会以同步方式完成? 例如,如上所示,我在ScanAsync()有三个异步操作; SingleOrDefualtAsync , ToListAsync和SaveChangesAsync […]

异步SQL查询执行 – Task.WaitAll(tasks)永远不会完成

我有一个应用程序使用异步查询执行将数据从MS SQL服务器移动到MySQL服务器; 数据移动正常,但RunAllTask​​s()方法中的Task.WaitAll(任务)调用永远不会完成。 异步任务都遵循PumpLocsAsync()的模式,其中通过BeginExecuteReader异步调用对MS SQL的调用; 当读者返回结果时,MySQL会正常插入。 .. async Task PumpLocsAsync() { using (var conn = new SqlConnection(SqlConnStr)) using (var cn = new MySqlConnection(MysqlConnStr)) using (var cmd = new SqlCommand()) { cmd.Connection = conn; cmd.CommandText = “SELECT HERE”; conn.Open(); var handle = cmd.BeginExecuteReader(); await Task.Factory.FromAsync(handle, (ar) => { var rdr = cmd.EndExecuteReader(ar); var qry = @”INSERT […]

如何使entity framework异步执行

我在ASP.Net MVC 5应用程序中遇到异步控制器问题。 我正在使用Entity Framework 6 Code First方法。 我有一个方法 public async Task Index() { using(var context = new MyDbContext()) { var eventsTask = context.Events .Where(e => e.Enable) .ToListAsync(); var countTask = context.Users .CountAsync(); await Task.WhenAll(eventsTask, countTask); return View(new ViewModel() { Events = eventsTask.Result, Count = countTask.Result }); } } 我这里有两个异步方法。 我通过MiniProfiler分别测量了它们。 它们需要大约85毫秒。 但在我的方法中,我使用Task.WhenAll()运行它们。 我相信它以异步方式执行Db查询,并且两者都需要大约85-90毫秒。 但它需要~170-180。 […]

我怎么在ConfiguredTaskAwaitable上“.Wait()”?

给出以下扩展以防止Tasks阻止UI线程(可能不是完全正确的术语,但无论如何): public static ConfiguredTaskAwaitable DontBlock( this Task T ) { return T.ConfigureAwait( false ); } public static ConfiguredTaskAwaitable DontBlock( this Task T2 ) { return T2.ConfigureAwait( false ); } 在某些情况下(例如,如果我需要在对象构造函数中调用awaitable,或者如果我需要从WinForms Program.Main( )方法调用.Wait( ) ),我需要执行以下操作: public class Foo{ public Foo( ){ //I know full well that the result from DontBlock does not have a ‘wait’ method, […]

Async Disposable.Create

Disposable.Create需要Action作为参数。 在处理Rx订阅时运行Action 。 在处理Rx订阅时,我想运行一些异步清理代码,但是使用带有Action async () =>与async void相同,我想避免使用它。 有关我为什么要避免这种情况的详细信息,请参阅此处 。 是否可以创建类似Disposable.AsyncCreate东西,它接受Func而不是Action 。 如果是这样,我应该如何将它作为CompositeDisposable一部分使用? 还是有其他模式来处理异步处置?

参考异步任务

如何将引用作为参数传递给Windows Store App中的Async方法? 我正在寻找这样的东西: var a = DoThis(ref obj.value); public async Task DoThis(ref int value) { value = 10; } 但是错误: 异步方法不能有ref或out参数 还有别的办法吗? 注意: 我需要传递完全obj.value。 此方法将由不同类型的对象,相同类型的对象,一个对象使用,但我将传递obj.val_1,obj.val_2或obj.val_10。 所有值都是相同的类型(对于ex string)