Tag: async await

async / await并打开FileStream?

在尝试确定我是否正确使用ReadAsync和CopyToAsync等Stream方法时,我遇到了以下问题: C#4.5文件读取性能sync vs async 在这个问题中,我在接受的答案中阅读了以下内容: 最值得注意的是,您的“异步”测试不使用异步I / O; 对于文件流, 您必须将它们显式地打开为异步,否则您只是在后台线程上执行同步操作。 在他的异步IO代码中,他使用以下命令“异步”打开FileStream : var file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true) 所以我想知道你是否打算使用像CopyToAsync这样的方法,你是否应该打开如上所示的底层FileStream ?而不是像下面那样做一些简单的事情: File.Open(filename, FileMode.Open) 以下是CopyToAsync实际文档中的CopyToAsync演示如何打开底层FileStream : https : CopyToAsync 如果打开底层FileStream方式useAsync ,那么FileStream构造函数的useAsync参数有什么作用?

等待Task.Delay花费的时间比预期的要长

我写了一个multithreading应用程序,它广泛使用async / await。 它应该在预定的时间下载一些东西。 为此,它使用’await Task.Delay’。 有时它每分钟发送数千个请求。 它按预期工作,但有时我的程序需要记录大的东西。 如果是这样,它会序列化许多对象并将它们保存到文件中。 在那段时间里,我注意到我的计划任务执行得太晚了。 我已将所有日志记录放在具有最低优先级的单独线程中,并且问题不再经常发生,但它仍然会发生。 事情是,我想知道它何时发生,以便知道我必须使用类似的东西: var delayTestDate = DateTime.Now; await Task.Delay(5000); if((DateTime.Now – delayTestDate).TotalMilliseconds > 6000/*delays up to 1 second are tolerated*/) Console.WriteLine(“The task has been delayed!”); 而且,我发现我也使用的’Task.Run’也会导致延迟。 要监控它,我必须使用更丑陋的代码: var delayTestDate = DateTime.Now; await Task.Run(() => { if((DateTime.Now – delayTestDate).TotalMilliseconds > 1000/*delays up to 1 second are tolerated*/) […]

散列/分片ActionBlocks

我需要并行处理某些项目,因此我使用的是TPL Dataflow 。 问题在于,共享相同密钥(类似于字典)的项目应按FIFO顺序处理,而不是彼此平行(它们可以与具有不同值的其他项目并行)。 正在完成的工作是CPU绑定最小的异步锁,所以我的解决方案是创建一个ActionBlock的数组,其大小为Environment.ProcessorCount ,没有并行性,并根据密钥的GetHashCode值发布到它们。 创建: _actionBlocks = new ActionBlock[Environment.ProcessorCount]; for (int i = 0; i < _actionBlocks.Length; i++) { _actionBlocks[i] = new ActionBlock(_ => ProcessItemAsync(_)); } 用法: bool ProcessItem(Key key, Item item) { var actionBlock = _actionBlocks[(uint)key.GetHashCode() % _actionBlocks.Length]; return actionBlock.Post(item); } 所以,我的问题是,这是我问题的最佳解决方案吗? 我是否会损害性能/可扩展性? 我错过了什么吗?

从Task.Run获取返回值

我在这里有以下代码 public static async Task Start(IProgress progress) { const int total = 10; for (var i = 0; i RunLongTask(i.ToString(CultureInfo.InvariantCulture))); if (progress != null) { var args = new ProcessTaskAsyncExProgress { ProgressPercentage = (int)(i / (double)total * 100.0), Text = “processing ” + i }; progress.Report(args); } } return “Done”; } private static string RunLongTask(string […]

异步等待Windows Phone Web访问API

是否支持WP8中的async / await模式? 我需要从基于Web的API获取XML,看起来WebClient或WebRequest不支持它。 是否有支持async / await的类可用于WP8 BCL中的Web访问? 如果没有,是否有可以使用的库? 我知道创建包装器来支持它并不困难,但这似乎是一个包含在SDK中的东西。

将async lambda表达式转换为委托类型System.Func ?

我有一个带有此签名的可移植类库中的异步方法: private async Task _Fetch(Uri uri) 它获取一个被回送为具体类型T的资源。 我正在使用第三方缓存库( Akavache ),它需要一个Func作为参数之一,并试图以这种方式这样做: await this.CacheProvider.GetOrCreateObject(key, async () => await _Fetch(uri), cacheExpiry); 这会导致错误: 无法将异步lambda表达式转换为委托类型’ System.Func ‘。 异步lambda表达式可能返回void , Task或Task ,其中任何一个都不能转换为’ System.Func ‘。 我已经尝试了Func赋值的各种排列而没有任何运气,我可以让代码工作的唯一方法是使Func阻塞: await this.CacheProvider.GetOrCreateObject(key, () => _Fetch(uri).Result, cacheExpiry); 哪个死了我的应用程序。 关于我误入歧途的任何指示?

如何让普通的WebRequest异步和等待?

我需要使以下代码异步和等待。 我需要从Web服务器获取大量数据,然后这些数据将用于填充我的应用程序中的xaml页面。 所以,我需要DefLogin()方法是可以接受的。 可能吗? public void DefLogin() { postData = “My Data To Post”; var url = new Uri(“Url To Post to”, UriKind.Absolute); webRequest = WebRequest.Create(url); webRequest.Method = “POST”; webRequest.ContentType = “text/xml”; webRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webRequest); } public void GetRequestStreamCallback(IAsyncResult asynchronousResult) { webRequest = (HttpWebRequest)asynchronousResult.AsyncState; Stream postStream = webRequest.EndGetRequestStream(asynchronousResult); byte[] byteArray = Encoding.UTF8.GetBytes(postData); postStream.Write(byteArray, 0, byteArray.Length); […]

递归和等待/异步关键字

我对await关键字的工作方式有一个脆弱的把握,我想稍微扩展一下我对它的理解。 让我头晕目眩的问题是使用递归。 这是一个例子: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestingAwaitOverflow { class Program { static void Main(string[] args) { var task = TestAsync(0); System.Threading.Thread.Sleep(100000); } static async Task TestAsync(int count) { Console.WriteLine(count); await TestAsync(count + 1); } } } 这个显然抛出了StackOverflowException 。 我的理解是因为代码实际上是同步运行的,直到第一个异步操作,之后它返回一个包含异步操作信息的Task对象。 在这种情况下,没有异步操作,因此它只是在错误的承诺下继续递归,它最终会返回一个Task 。 现在改变它只是一点点: using System; using System.Collections.Generic; using […]

高性能异步等待套接字

我正在编写一个应用程序,需要通过tcp进行数百个套接字连接才能读/写数据。 我在这里遇到过这段代码片段 ,我想知道如何让它更强大。 这是我目前调用代码的方式: foreach (var ip in listofIps) { IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ip), 4001); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); client.Connect(remoteEP); await ReadAsync(client); } 以上是否有任何问题,如何进行优化以使其同时运行? 在代码片段中,缓冲区大小设置为1000.正如一个简单的说明,如果我只尝试打印出接收的字节,而不是剩余的0x00,我必须做这样的事情: while (true) { await s.ReceiveAsync(awaitable); int bytesRead = args.BytesTransferred; if (bytesRead <= 0) break; var hex = new StringBuilder(bytesRead * 2); var msg = new byte[bytesRead]; […]

最好的异步方法

我需要编写一些基本上尝试重复与数据库对话并初始化的异步代码。 通常,第一次尝试将失败,因此需要重试。 在旧的日子里,我会使用类似于以下的模式: void WaitForItToWork() { bool succeeded = false; while (!succeeded) { // do work succeeded = outcome; // if it worked, mark as succeeded, else retry Threading.Thread.Sleep(1000); // arbitrary sleep } } 我发现最近对.NET的异步模式进行了很多改动,所以我的问题是这是最好的方法,或者在探索async内容时是否值得,如果是这样,我如何在async实现这种模式? 更新 为了澄清,我想异步生成这个工作,以便生成它的方法不必等待它完成,因为它将在服务的构造函数中生成,因此构造函数必须立即返回。