Tag: 异步

上升的事件没有阻塞并以正确的顺序接收事件

这首先需要一些解释。 有一个工作线程必须引发一些事件: Task.Run(() => { for(int i = 0; i < 123456789; i++) { … // some job OnSomeEvent(i); } }); 同步上升事件将阻止作业,直到所有事件处理程序完成: void OnSomeEvent(int i) => SomeEvent?.Invoke(this, new SomeEventArgs(i)); 异步事件上升不会再阻止工作了(耶!) void OnSomeEvent(int i) => Task.Run(() => SomeEvent?.Invoke(this, new SomeEventArgs(i))); 但现在还有另一个问题:未按正确顺序收到事件: OnSomeEvent(1); OnSomeEvent(2); OnSomeEvent(3); … // event handler SomeEvent += (s, e) => Console.WriteLine(eI); // possible […]

使用Rx Framework使用void AsyncMethod(Action 回调)模式进行异步调用

我已经看到很多关于如何在Rx框架中使用Observable.FromAsyncPattern()来简化异步调用的示例,但我使用的是不使用IAsyncResult的标准异步模式的接口BeginXXX / EndXXX(IAsyncResult) ,所以这对我不起作用。 我正在使用的库使用回调模式公开异步函数: void GetAllObjects(Action<List> callback) 在一个理想的世界里,我想转此: var isLoadingUsers = true; var isLoadingSystems = true; var isLoadingCustomers = true; var isLoadingRules = true; mClient.GetAllUsers(UsersCallback); mClient.GetAllCustomers(CustomersCallback); mClient.GetAllRules(RulesCallback); // set the IsLoadingXXX variables to false in callbacks // once all are false mClient.GetAllSystems(SystemsCallback); 变成这样的东西: var o = Observable.ForkJoin( Observable.Start(GetAllUsers()), Observable.Start(GetAllCustomers()), Observable.Start(GetAllRules()) ).Finally(() => GetAllSystems); 如何将该模式转变为返回IObservable的模式?

如何异步填充虚拟模式下的ListView?

我想在列表视图中显示我们数据库中的记录 – 但检索可能需要很长时间。 我可以使用RetrieveVirtualItem告诉我何时需要新的ListViewItem,添加一个虚拟项目,然后开始检索; 但是当数据库返回时我该如何处理记录呢? 当ListView在VirtualMode中时,我无法更新ListView的Items集合。 有没有办法告诉ListView重新加载项目? 或者我可以保持对ListViewItem的引用并填充它? 如果这些都不起作用,我还能以异步方式在虚拟模式下填充ListView吗?

如何在异步方法中向UI提供反馈?

我一直在开发一个Windows表单项目,我有10个任务要做,我想以async方式执行此操作。 当用户单击按钮并且我调用async方法执行此操作时,这些任务将会出现。 在我的代码中,我已经有了这些进程的参数列表。 我的问题是: A)如何转换我的代码并行运行所有进程? (我想实现async / await) B)如何向我的UI应用程序提供反馈? 下面的代码是我试过的: 我的按钮调用方法来启动进程 private void button1_Click(object sender, EventArgs e) { // almost 15 process foreach (var process in Processes) { // call a async method to process ProcessObject(process); } } 模拟我的进程获取参数的方法 private async void ProcessObject(ProcessViewModel process) { // this is my loop scope, which I need to […]

如何处理具有异步方法的对象?

我有这个对象PreloadClient实现IDisposable ,我想处理它,但在异步方法完成他们的调用后……这没有发生 private void Preload(SlideHandler slide) { using(PreloadClient client = new PreloadClient()) { client.PreloadCompleted += client_PreloadCompleted; client.Preload(slide); } // Here client is disposed immediately } private void client_PreloadCompleted(object sender, SlidePreloadCompletedEventArgs e) { // this is method is called after a while, // but errors are thrown when trying to access object state (fields, properties) } […]

将同步代码包装到异步方法中的最佳方法是什么

我正在使用async-await方法创建一个应用程序。 但是使用它们对我来说存在很大问题。 在阅读了一些文章之后,我仍然不知道将重同步操作包装到异步方法的最佳方法是什么。 我有2个想法。 哪一个是最好的? 1)目前的实现。 private Task<List> ParseTestFiles(List filesContent) { var tcs = new TaskCompletionSource<List>(); Task.Run(() => { var resultList = new List(); foreach (var testBody in filesContent) { try { var currentCulture = Thread.CurrentThread.CurrentCulture; var serializerSettings = new JsonSerializerSettings { Culture = currentCulture }; var parsedData = JsonConvert.DeserializeObject(testBody, serializerSettings); resultList.Add(parsedData); } catch(Exception exception) […]

从async / await方法返回列表

我想以异步方式提出Web服务请求。 我在这里称呼它: List list = GetListAsync(); 这是我的函数的声明,它应该返回一个列表: private async Task<List> GetListAsync(){ List list = await Task.Run(() => manager.GetList()); return list; } 如果我想编译我得到以下错误 Cannot implicitely convert type System.Threading.Tasks.Task<System.Collections.Generic.List> to System.Collections.Generic.List 据我所知,如果我使用async修饰符,结果会自动包含在Task中。 我认为这不会发生,因为我使用Task.Run 。 如果我删除Task.Run(() =>部分我得到 无法等待System.Collections.Generic.List表达式 我想我还没有完全理解async / await方法。 我做错了什么?

MSTEST – 异步Testinitialize保证测试失败

只是想知道,如果有人这样想: 这是在TestInitialize中进行异步调用的错误设计,因为TestInitialize必须在任何TestMethod之前发生。 这可能是以任何方式进行异步TestInitialize的正确方法吗? private int val = 0; [TestInitialize] public async Task TestMehod1() { var result = await LongRunningMethod(); val = 10; } [TestMethod] public void TestMehod2() { Assert.AreEqual(10, val); } 任何想法?

为什么等待不会出现阻止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 […]

用C#异步调用WCF?

在C#中,如何对WCF Web服务进行异步调用? 我有一个服务参考设置来生成异步。 我还修改了我使用{WebServiceObject.Begin *()}的调用,但最后有两个参数,’AsyncCallback’和’object asyncState’。 这些是什么以及如何使用它们? 谢谢,