Tag: 异步

C#WebClient使用Async并返回数据

好吧,我在使用DownloadDataAsync并将字节返回给我时遇到了问题。 这是我正在使用的代码: private void button1_Click(object sender, EventArgs e) { byte[] bytes; using (WebClient client = new WebClient()) { client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged); bytes = client.DownloadDataAsync(new Uri(“http://example.net/file.exe”)); } } void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) { double bytesIn = double.Parse(e.BytesReceived.ToString()); double totalBytes = double.Parse(e.TotalBytesToReceive.ToString()); double percentage = bytesIn / totalBytes * 100; label1.Text = Math.Round(bytesIn / 1000) […]

Promise.defer的正确模式是什么?

我正在使用TypeScript和async / await来表示异步工作流。 该工作流程的一部分是呼叫Web工作者,并在回调结果时继续。 在C#中,我创建了一个TaskCompletionSource , await它的Task ,代码中的其他地方会调用SetResult来解析TaskCompletionSource 。 我可以在JavaScript中做同样的事情,通过使用Promise.defer()初始化Deferrer对象, await其Promise和其他地方,在window.onmessage监听器中将调用resolve (或reject )方法让异步工作流继续。 听起来很可爱,但MDN说defer已经过时了。 使用Promise构造函数的提议解决方案使Promise执行工作并调用resolve / reject方法对我不起作用,因为该逻辑可能超出我的范围,我只想在对象上调用resolve或reject on在一个完全不同的词汇范围内,我不能用那个function做到这一点。 有一个向后兼容的帮助器 ,它通过绑定我可以使用的resolve和reject函数来给我这样的对象,而无需查询我的代码的语义。 但这是一种不好的做法吗? 有没有公​​认的,更好的模式? 什么是JavaScript中TaskCompletionSource的惯用等价物?

任务一直在等待激活

我尝试使用Microsoft.Http的API。 我按照这里给出的样本http://www.asp.net/web-api/overview/advanced/calling-a-web-api-from-a-net-client ,但我的任务没有完成,保持状态WaitingForActivation 登录按钮: private void btnLogin_Click(object sender, EventArgs e) { try { var t = Api.LoginAsync( tbUsername.Text, tbPassword.Text); t.Wait(); _Token = t.Result; } catch (Exception ex) { ShowError(ex.Message); } } Api课 static class Api { private const string URLBase = “http://localhost:28929/”; public static async Task LoginAsync(string Username, string Password ) { using (var client […]

WinFormsmultithreading:仅在前一个更新完成后才执行GUI更新

我有multithreading应用程序和一些后台处理。 它具有长时间运行的UI更新 (在UI线程本身上),它们通过MSDN上的知名资源从后台线程调用。 我无法缩短这些UI更新,因为它们最终在外部库中完成(1)。 现在,从该后台线程, 我想在UI线程上异步调用(使用BeginInvoke() )这些更新,但前提是尚未完成上一次更新。 如果没有,我想简单地跳过此更新。 这将防止Windows消息队列溢出,以防调用比调用方法能够执行的速度快。 我目前的解决方案是:在UI线程上执行的方法中,我进入并退出ReaderWriterLockSlim实例。 在后台线程上,我尝试以零超时进入实例。 成功后,我调用’BeginInvoke()’然后再次退出。 如果不成功,我会完全跳过方法调用。 public void Update(double x, double y) { _updateLock.EnterWriteLock(); try { //…long running task… } finally { _updateLock.ExitWriteLock(); } } //…. void Provider_PositionChanged(object sender, SpecialEventArgs e) { if (_updateLock.TryEnterWriteLock(0)) //noone is currently executing an update? { try { myUiControl.BeginInvoke(/*…*/); } finally { _updateLock.ExitWriteLock(); […]

如何在Web请求上传输CancellationToken

我正在做一些关于通过WebAPI取消异步请求的研究, 最近我发现最新版本的WebApi(不是.NET-Core)支持取消令牌。 作为测试我写了这段代码。 [HttpGet] [Route(“LongRequest”)] public async Task VeryLongRequest(string Key, CancellationToken token) { for (int i = 0; i < 5; ++i) { if (false == token.IsCancellationRequested) { Thread.Sleep(5000); } else { Trace.WriteLine("Cancelled"); } } return "Complete"; } 当用户关闭窗口/刷新/或导航到新页面(不在SPA上)时,此代码有效,并且更新取消令牌。 因为HTTP请求是无状态的,取消映射如何回到请求? 我怎样才能从我的客户手动调用取消?

异步方法上的事件订阅

我想以两种方式启动LoadDataAsync 。 首先是使用ManualLoad()和经典方法ManualLoad() 。 但我不能让它发挥作用。 我无法订阅任务返回。 使用void它可以正常工作,但是无法在ManualLoad()方法中await void 。 两种方式如何运作? public delegate void ProductDelegate(long? iShopProductId); public event ProductDelegate ProductSelectionChanged = delegate { }; public async Task LoadDataAsync(long? iProductId) { //await action…. } //first way public void FormLoad() { this.ProductSelectionChanged += LoadDataAsync //UNDERLINED ERROR; } //second way public async Task ManualLoad() { await LoadDataAsync(2); }

如何更改异步方法调用以防止强制异步调用堆栈

如果我需要调用一个方法,在内部调用一些异步方法,作为一个fire and forget操作,我怎么能阻止这个调用强制“async”需要用完调用栈来说… MVC控制器? 例如:我的MVC控制器(非异步)调用业务层方法,该方法又调用Windows Azure Service Bus QueueClient.SendAsync(BrokeredMessage),将消息放入队列中,但不需要等待它完成。 通常,在调用此控制器操作时,编译器将抛出一个错误,指出此时无法启动异步操作。 我知道不是等待或只是调用SendAsync()方法,我可以使用ContinueWith()跟进它,以便在异步操作的回调上执行代码,但我被告知这不是一个正确的解决方案。 (请参阅对控制器中调用异步方法的响应) 有人会关心如何解决这种情况的最佳方法吗? 并告诉我为什么ContinueWith()方法不正确?

如何在不需要等待当前函数/线程的结果的情况下运行异步任务?

有没有机会避免等待? 我们想要的例子: async Task SomeTask() { await ChildTask(); //Then something we want to be done without waiting till “Child Task” finished OtherWork(); } async Task ChildTask() { //some hard work }

Task.Delay()和新任务(()=> Thread.Sleep())之间的区别

我正在整理一个小小的演示,以便使用Thread.Sleep()模拟一个长时间运行的方法,并希望添加异步以轻松地从同步过程转到异步过程。 这是初始代码: private void button1_Click(object sender, EventArgs e) { LongProcess(); } private void LongProcess() { for (int i = 0; i < 33; i++) { progressBar1.Value += 3; Thread.Sleep(1000); } progressBar1.Value += 1; } 我以为我可以简单地将Thread.Sleep(1000)更改为new Task(()=>Thread.Sleep(1000)) ,如下所示: private void button1_Click(object sender, EventArgs e) { LongProcess(); } private async void LongProcess() { for (int i = […]

entity framework异步记录计数与记录

我正在尝试从数据库中获取记录,但在同一次调用DB中获取记录计数。 我的方法是异步的,所以我不确定这是否是正确的方法: public async Task<IEnumerable> GetAsync(int pageIndex, int pageSize) { var products = this.Repository.GetAll().OrderBy(p => p.Price).AsQueryable(); var count = await products.CountAsync(); if (count == 0) return new List(); products = products.ToPaginatedList(pageIndex, pageSize); var result = await products.ToListAsync(); var viewModels = new List(); Mapper.Map(result, viewModels); return viewModels.AsEnumerable(); } 我认为等待CountAsync()不太好,但我不确定如何实现它。 问候。 编辑: 我为没有在任何地方返回计数而道歉,因为它现在看起来我只计算因为== 0检查,但我最终将返回计数记录,因为我需要它为我的角度分页指令。 还没弄明白我将如何返回(新类vs元组)所以我错过了它并专注于单个数据库调用中的entity frameworkCount()和实体提取。