Tag: async await

dependency injectionUserManager正在处理异步调用(ASP.NET CORE)

我正在使用ASP.NET Core及其内置的dependency injection和asp.net身份。 我遇到的问题是每当我尝试通过异步访问任何上下文时(即在此示例中为UserManager ),它在访问时都会被处理掉。 例如,我的控制器在下面(我们关注的对象是UserManager ) private readonly ApplicationDbContext _dbContext; private readonly UserManager _userManager; private readonly ViewRender _view; private readonly IConfiguration _config; public UserController(ApplicationDbContext dbContext, UserManager userManager, ViewRender view, IConfiguration config) { this._dbContext = dbContext; this._userManager = userManager; this._view = view; this._config = config; } 请注意,正在使用startup.cs中的visual studio模板默认设置注入_userManager 现在在这个控制器的方法中我尝试以下方法: [HttpDelete] public async void Delete(string id) […]

任务状态:等待激活-DownloadStringTaskAsync -WP8

任务的状态始终是“等待激活”。任务的结果=“”。 我不明白为什么…感谢您的帮助UI调用GetDocLibs方法。 public class ServerFunctions { public static List GetDocLibs(bool onlyDocLibPerso) { string xmlContent = GetXml(); List result = BdeskDocLib.GetListFromXml(xmlContent, onlyDocLibPerso); return result; } private static String GetXml() { Tasktask=requesteur.Query(dataRequestParam); task.Wait(); xmlResult = task.Result; return xmlResult; } } public class DataRequest { public Task Query(DataRequestParam dataRequestParam) { try { WebClient web = new WebClient(); if […]

Async / Await Lambdas

我有一个奇怪的问题,结合async / await使它工作:我创建了一个小程序,它应该基本上处理每个动作的try / catch: internal static void HandledAction(Action action, Info infoBar) { try { action(); } catch (Exception ex) { infoBar.SetError(“An Exception occured: ” + ex.Message); WriteLog(ex.StackTrace); } 看起来很花哨,但它的价值很高,因为改变error handling非常容易。 但是,如果我想在Lambda中获取数据异步,会发生什么? 让我们举一个简单的例子: private void mnuImportData_Click(object sender, RoutedEventArgs e) { ActionHelper.HandledAction(async () => { throw new NotImplementedException(“Ups”); }, infoMain); } 当然,HandledAction被调用,传递,因为它返回指针,exception被抛出,当然不会被处理。 我想我必须创建一个AsyncHandledAction,并设置动作异步,但有没有更简单的方法来解决这个问题? 我想很多人都使用中央exception处理,并且有更好的解决方案吗? 提前致谢 马蒂亚斯 […]

等待事情发生 – 异步或同步模型?

我有这个方法WaitForReaderArrival ,如下所示:( 等待读者到达的所有时间运行) public void WaitForReaderArrival() { do { if (ReaderArrived()) { break; } System.Threading.Thread.Sleep(1000); } while (ReaderArrived() == false); } 而我正在等待读者使用, await Task.Run(new Action(WaitForReaderArrival)); if (ReaderArrived()) { //Raise an ReaderArrived here! ..//blah blah } 我的一位同事让我改变上面这句话 WaitForReaderArrival(); if (ReaderArrived()) { //Raise an ReaderArrived here! ..//blah blah } 问题是: 我上面采用的异步模型是不是真的有用? 为什么她要我将这一行更改为正常的同步方法仍然是一个问题。 以上是等待事情发生然后继续的正确方法?

无法将类型’System.Collections.Generic.List ‘隐式转换为’System.Threading.Tasks.Task >

我得到一个例外。 无法将类型’System.Collections.Generic.List’隐式转换为’System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable>’ 以下是我的财产和方法。 private List WebFormFields { get; set; } = new List(); Task<IEnumerable> IRegistrationRepository.GetWebFormFields() { return WebFormFields; }

在另一个AppDomain中调用Await时没有SynchronizationContext

我已经成功构建了一个插件机制,我可以在单独的AppDomain中创建UI控件,并将它们显示为主AppDomain中Form的一部分。 这些UI控件执行自己的数据加载,因此当我打开表单时,会创建大约10个不同的插件,并且每个插件都需要加载其数据。 如果我同步执行此操作,这一切都可行,但我想在每个插件中使用async / await模式。 我的刷新方法如下所示: protected async void RefreshData() { _data = await LoadAsync(_taskId); <= UI Thread 🙂 OnDataChanged(); <= Worker Thread 🙁 } 现在开始这个问题。 当我输入这个方法时,我在主UI线程上。 但是当await结束时,我在一个工作线程上,所以我在OnDataChanged()方法中得到了一个交叉线程exception,它更新了控件。 await应该默认使用SynchronizationContext.Current来继续,但由于我在另一个AppDomain中,这恰好是NULL。 所以我的问题是。 如何配置await继续当前线程,即UI线程? 我知道我可以获取一个控件并执行Invoke(),但我也使用MVVM模式,这是在View模型中,因此我无法访问任何控件,所有View Model – > View通信都是通过数据完成的绑定。

在后台异步进程运行时,开发人员可以“强制”系统以防止“Metro”应用程序被暂停吗?

当一个应用程序当前在Win8中不是“正面和中心”时,它将被暂停。 这是否会阻止应用程序在后台显式保持活动状态,例如在电子邮件客户端中,使用异步操作轮询邮件服务器以获取新邮件,然后下载它们(然后使用新邮件计数更新Tile)? 如果这是不可能的(暂停的应用程序无法执行后台处理,或者无法强制系统允许它保持活动状态,尽管不可见),那么解决方法是什么 – 单独的Windows服务?

c#如何处理异步void

我通常对web服务器进行编程,起初我认为必须有连续的方法链返回任务,所以堆栈中的内容可能会询问数据库是否完成。 最近我看到了wpf代码,它做了类似的事情: public async void Execute(object parameter) { await ExecuteAsync(parameter); } 在事件处理程序中调用。 UI似乎是响应式的,所以我猜它确实有效。 它是如何工作的? 这如何转化为aspnet?

等待IO的可重用测试代码

我正在尝试在WCF公开的方法/服务上使用async / await。 一切正常,但我想模拟实际等待IO的服务方法,以便服务调用将注册到IO完成端口,并将线程放回线程池。 为了澄清,我只是在尝试确认IO完成端口的使用,并更好地理解实际发生的机制。 所以我的测试服务目前看起来像这样: [ServiceContract] public interface IHelloWorldService { [OperationContract] Task SayHello(string firstName, string lastName); } public class HelloWorldService : IHelloWorldService { public async Task SayHello(string firstName, string lastName) { string str = string.Format(“Hello {0} {1}”, firstName, lastName); return await Task.Factory.StartNew(() => str); } } 我想在SayHello()中做一些事情来使代码等待一些IO,理想情况下我可以复制/粘贴的代码模式通常在我想模拟等待IO时使用。 通常,Thread.Sleep()用于模拟长时间运行的任务,但我很确定这会使线程池线程进入hibernate状态而不会触发IO完成端口的使用。

在客户端和服务中应用异步等待之间的区别

我已经创建了一个WCF服务,并且它的操作包含和实现如下: [OperationContract] Task GetName(string name); public async Task GetName(string name) { await Task.Delay(5000); var task1 = Task.Factory.StartNew(() => { return “Your name is : ” + name; }); var result = await task1; return result; } 现在我在客户端使用此服务并创建了客户端。 ServiceReference1.Service1Client client = new ServiceReference1.Service1Client(); 它显示了我的实现的两种方法:GetName和GetNameAsync 我可以使用以下两种方式来访问该服务。 var result_GetName = await Task.Factory.StartNew(() => client.GetName(“My Input”)); var result_GetNameAsync = […]