Tag: 异步

异步下载文件到客户端

我很难完成任务。 我正在使用asp.net MVC 4构建一个mailclient。 我需要将与消息(不是附件)相关的图像下载到客户端浏览器。 现在我有这个设置: 客户端浏览器 – >控制器/后端 – >邮件服务器 澄清:我有一个客户端请求包含图像的内容ID,正确的邮箱,消息等。有了这些信息,我可以从邮件服务器下载图像并将其上传到客户端。 现在来了困难的部分:我想这样做异步。 我希望能够从邮件服务器下载一个512 KB的块,解码该部分,并将其发送到客户端.. fetch – decode – send ..只要浏览器获得图像的所有数据。 我只是不想先将所有数据首先下载到服务器,然后创建一个包含所有数据的新内存流,并将其作为fileresult返回。 我太害怕在我的内存中获取太大的文件并阻止其他进程等。 我打算使用这种方法上传真正的附件(可能是100的MB)。 所以我稍后会需要这种方法。 现在我只是不知道如何实现这一点,因为我有一个连接到邮件服务器,我有一个连接到客户端。 我必须将数据传递给新流或其他东西来完成这项工作.. 有人可以帮帮我吗? 编辑:澄清:不,我不能引用邮件服务器上的文件。 我必须通过套接字将文件下载到服务器。 Edit2:http chuncked可以解决吗? 如果是的话,你能给我一个小例子吗?

我是否需要使用ReaderWriterLockSlim的MemoryBarrier?

看起来单声道实现在ReaderWriterLockSlim方法中没有MemoryBarrier调用。 因此,当我在write lock内进行任何更改时,我可以在另一个使用read lock线程中接收旧的缓存值。 真的有可能吗? 我应该在读写锁定内的代码之前和之后插入MemoryBarrier吗?

如何检查异步Web服务调用中的错误

我正在开发ASP.Net asmx Web服务。 在客户端,如果对服务器的请求返回Http错误代码,如http 500,我怎么能从Web服务客户端知道(我使用添加Web引用自动生成的客户端代理)? 乔治,提前谢谢

应该弃用Task.Wait吗?

我学到了从池线程调用Task.Wait会导致线程饥饿死锁的困难方法。 根据这篇MSDN文章 ,在“死锁”一章中,我们应遵守这两条规则: 不要创建任何同步方法等待异步函数的类,因为可以从池中的线程调用此类。 如果类阻塞等待异步函数,则不要在异步函数内使用任何类。 似乎唯一合法使用Task.Wait的地方是主要function – 我在这里夸大了一点,但你明白了。 为什么Task.Wait仍然是.NET框架的一部分,看它有多危险?

等待IAsyncResult方法等待另一个IAsyncResult(链接)

(只能使用.NET 3.5库存,因此没有任务,没有Reactive Extensions) 我有,我认为是一个简单的案例,但我很困惑。 缺点是,我将BeginGetRequestStream的IAsyncResult返回给BeginMyOperation()的调用者,我想真正发送回BeginGetResponse的IAsyncResult,它在调用EndGetRequestStream时调用。 所以我想知道,我该怎么做 public IAsyncResult BeginMyOperation(…) { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(requestUri); webRequest.Method = “POST”; // This is the part, that puzzles me. I don’t want to send this IAsyncResult back. return webRequest.BeginGetRequestStream(this.UploadingStreamCallback, state); } // Only want this to be called when the EndGetResponse is ready. public void EndMyOperation(IAsyncResult ar) { } […]

使用await Task.Delay进行杀戮性能

假设我想开始大致每秒分配N个任务。 所以我尝试了这个: public async Task Generate(int numberOfCallsPerSecond) { var delay = TimeSpan.FromMiliseconds(1000/numberOfCallsPerSecond); // a call should happen every 1000 / numberOfCallsPerSecond miliseconds for (int i=0; i < numberOfcallsPerSecond; i++) { Task t = Call(); // don't wait for result here await Task.Delay(delay); } } 起初我预计这将在1秒内运行,但对于numberOfCallsPerSecond = 100 ,我的12核CPU需要16 seconds 。 似乎等待Task.Delay增加了很多开销(当然没有它就可以在3ms内生成调用。 在这种情况下,我没想到await会增加很多开销。 这是正常的吗? 编辑: 请忘记Call()。 […]

TPL Dataflow:在保持秩序的同时设计并行性

我以前从未使用过TPL,所以我想知道是否可以用它完成:我的应用程序从很多帧创建一个gif图像动画文件。 我从一个Bitmap列表开始,它代表了gif文件的帧,需要为每个帧执行以下操作: 在框架上绘制一些文本/位图 裁剪框架 调整框架大小 将图像缩小为256色 显然,这个过程可以对列表中的所有帧并行完成,但是对于每个帧,步骤的顺序必须相同。 之后,我需要将所有帧写入gif文件。 因此,需要以与原始列表中相同的顺序接收所有帧。 最重要的是,此过程可以在第一帧准备就绪时开始,无需等到所有帧都被处理完毕。 这就是情况。 TPL Dataflow适合这个吗? 如果是的话,任何人都可以给我一个关于如何设计tpl块结构以反映上述过程的正确方向的提示吗? 与我发现的一些样品相比,这对我来说似乎相当复杂。

使用HttpClient进行异步文件下载

我有一个服务,它返回一个csv文件到POST请求。 我想使用异步技术下载所述文件。 虽然我可以获取该文件,但我的代码有几个突出的问题和问题: 1)这真的是异步的吗? 2)有没有办法知道内容的长度,即使它是以分块格式发送的? 想想进度吧)。 3)如何最好地监控进度,以便在所有工作完成之前推迟程序退出。 using System; using System.IO; using System.Net.Http; namespace TestHttpClient2 { class Program { /* * Use Yahoo portal to access quotes for stocks – perform asynchronous operations. */ static string baseUrl = “http://real-chart.finance.yahoo.com/”; static string requestUrlFormat = “/table.csv?s={0}&d=0&e=9&f=2015&g=d&a=4&b=5&c=2000&ignore=.csv”; static void Main(string[] args) { while (true) { Console.Write(“Enter a symbol […]

何时是使用Task.Result而不是等待任务的最佳位置

虽然我已经在.NET中使用异步代码一段时间了,但我最近才开始研究它并了解正在发生的事情。 我刚刚经历了我的代码并试图改变它,所以如果一项任务可以与某些工作并行完成,那么它就是。 例如: var user = await _userRepo.GetByUsername(User.Identity.Name); //Some minor work that doesn’t rely on the user object user = await _userRepo.UpdateLastAccessed(user, DateTime.Now); return user; 现在变成: var userTask = _userRepo.GetByUsername(User.Identity.Name); //Some work that doesn’t rely on the user object user = await _userRepo.UpdateLastAccessed(userTask.Result, DateTime.Now); return user; 我的理解是现在正在从数据库中获取用户对象WHILST正在进行一些不相关的工作。 但是,我看到的post暗示结果应该很少使用,等待是首选但我不明白为什么我要等待我的用户对象被提取,如果我可以执行一些其他独立的逻辑同时?

微软异步服务器套接字示例

我有一个关于这个问题的问题(“异步服务器套接字多个客户端”)。 要么微软改变了这个例子,因为Groos回答或者我真的没有得到它 – 在示例中它说: while (true) { // Set the event to nonsignaled state. allDone.Reset(); // Start an asynchronous socket to listen for connections. Console.WriteLine(“Waiting for a connection…”); listener.BeginAccept( new AsyncCallback(AcceptCallback), listener ); // Wait until a connection is made before continuing. allDone.WaitOne(); } 据我所知,在while(true)循环中连续调用BeginAccept()函数,只有在调用AcceptCallback()函数时才会被调用,因为首先发生的是allDone.Set()。 但格罗说 MSDN示例的问题在于它只允许连接单个客户端(listener.BeginAccept只调用一次)。 实际上我不明白为什么使用ManualResetEvent allDone …而且我认为listener.EndAccept(ar)方法无论如何都是阻塞的。 listener.BeginAccept()是否在仍然运行时第二次调用时抛出exception? 但是,如果是这样,为什么allDone.Set()在listener.EndAccept(ar)之前呢? 还有一个问题: 在收到EOF后,我可以在ReadCallback(IAsyncResult ar)函数中调用handler.BeginReceive(…)来等待来自同一客户端的更多数据吗? […]