Tag: 异步

使用标准.Net异步模式的优点?

我正在设计一个执行长时间运行任务的类。 我想出的第一个设计是: public TaskHandle DoSomethingAsync(DoSomethingCompleteCallback completedCallback); public void CancelDoSomething(TaskHandle handle); 这简单而简洁。 但是,我想知道我是否应该将其作为我一直在阅读的标准.Net异步模式之一来实现? APM: public IAsyncResult BeginDoSomething(AsyncCallback completedCallback, Object stateObject); public void EndDoSomething(IAsyncResult asyncResult); EAP: public void DoSomethingAsync(string param, object userState); public event DoSomethingCompletedEventHandler DoSomethingCompleted; IMO这些似乎使界面变得复杂,除了作为其他.Net开发人员可识别的模式之外没有任何实际优势。 APM要求客户端代码始终在其completedCallback中调用EndDoSomething(),并且EAP需要单独订阅已完成的事件。 如果有的话,使用我缺少的标准模式有什么好处?

阅读非常大的文本文件,我应该合并异步吗?

我一直面临着制作一种方法的挑战,该方法将非常大的文本文件读入程序,这些文件的范围可以从2gb到100gb。 到目前为止,这个想法一直是读取方法中的几千行文本。 目前,使用流阅读器设置程序,逐行读取文件并处理在该行上找到的必要数据区域。 using (StreamReader reader = new StreamReader(“FileName”)) { string nextline = reader.ReadLine(); string textline = null; while (nextline != null) { textline = nextline; Row rw = new Row(); var property = from matchID in xmldata from matching in matchID.MyProperty where matchID.ID == textline.Substring(0, 3).TrimEnd() select matching; string IDD = textline.Substring(0, 3).TrimEnd(); foreach […]

使用C#中的异步套接字在任何给定时间将消息发送回客户端列​​表

我已经设置了异步服务器,它通过连接,接收和发送消息到连接客户端完美地工作。 服务器本身是游戏世界服务器(mmorpg风格)。 当用户将其位置发送到其所在的位置时,我需要使用PlayerPositionNotice将其推送到所有客户端。 我知道我在这里缺少一些基本的东西,但是当我尝试保存在accept方法中创建的StateObject,并使用该套接字在任何给定时间将信息发送回播放器时它会因套接字关闭而失败。 = /不知道为什么会发生这种情况,我会在这个问题上搜索几个引擎但是又回来了。 这就是我创建服务器的方式: 首先,我们有全球性的东西: public StateManager _stateManager = new StateManager(); public bool IsClosing = false; private const int _port = 1025; private IPHostEntry _localhost; private IPEndPoint _endpoint; private Socket _serverSocket; private Thread _serverThread; 第二个我们有初始化的东西: public void Start() { _serverThread = new Thread(Initialize); _serverThread.Start(); } /// /// Main entry point for the […]

Task.Run继续在同一个线程上导致死锁

考虑以下我将要同步等待的异步方法。 等一下,我知道。 我知道它被认为是不好的做法并导致死锁 ,但我完全意识到这一点并采取措施通过使用Task.Run包装代码来防止死锁。 private async Task BadAssAsync() { HttpClient client = new HttpClient(); WriteInfo(“BEFORE AWAIT”); var response = await client.GetAsync(“http://google.com”); WriteInfo(“AFTER AWAIT”); string content = await response.Content.ReadAsStringAsync(); WriteInfo(“AFTER SECOND AWAIT”); return content; } 这个代码肯定会死锁(在具有SyncronizationContext的环境中,如在ASP.NET之类的单个线程上调度任务),如果这样调用: BadAssAsync().Result 。 我面临的问题是即使使用这种“安全”包装器,它仍然偶尔会出现死锁。 private T Wait1(Func<Task> taskGen) { return Task.Run(() => { WriteInfo(“RUN”); var task = taskGen(); return task.Result; }).Result; […]

获取异步方法体中的当前Task实例

如果我有一个像这样的异步方法体 – public async Task GetSomething() { await SendText(“hi”); await SendImage(“bla.bmp”); } 在等待启动时​​,如何在将Task对象返回给用户之前获取该对象 即.. public async Task GetSomething() { myTasks.Add(Task.Current); await SendText(“hi”); await SendImage(“bla.bmp”); //some processing } 所以我可以做的其他地方 await Task.WhenAll(myTasks); Console.WriteLine(“All tasks complete”); 这样我就可以在关机前等待所有任务完成

c#WebClient DownloadProgresschanged TotalBytesToReceive = -1

我看过网络,看不到其他人有这个问题。 我使用的是使用DownloadFileAsync的Web客户端,当调用事件处理程序(DownloadProgressChanged)时,由于某种原因,TotalBytesToReceive(来自DownloadProgressChangedArgs)等于-1,从而阻止我使用进度条。 我正在检测<0,如果是这样的话,现在只需要猜100meg就可以了。 然而,BytesRecieved正在工作,文件实际上正在被下载,并且AsynCompletedEventHadnler似乎被调用,因此它知道它已完成(因此必须以某种方式知道TotalBytesToReceive?)。 我正在使用具有凭据和代理凭据的WebClient从通过内部网络的密码保护外部站点下载(因此需要两者) – 不确定这是否会有所不同。 我以前使用WebClient.DownloadData获取字节数据并单独保存并将其放在后台工作程序中,它工作正常(如果非常慢)但我无法以这种方式显示进度。 此外,DownloadFileAsync似乎为我做了所有这些,因此节省了大量代码。 private void DLFile_AsyncWithStatus(string DLlocation, string un, string pw, string destLoc) { WebClient wc = new WebClient(); wc.Credentials = new NetworkCredential(un, pw); // website login wc.Proxy.Credentials = new NetworkCredential(ProxyUsername, ProxyPassword, ProxyDomain); //proxy login Uri uri = new Uri(DLlocation); // Specify that the DownloadFileCallback method gets called when […]

Powershell C#异步执行

我想在C#中异步执行Powershell脚本。 我已经使用了BeginInvoke方法,但即使我为它们附加了委托,我也无法获得输出/错误。 这是我的C#代码: using(ps=PowerShell.Create()) { PSDataCollection output=new PSDataCollection(); output.DataAdded+=output_DataAdded; ps.AddScript(RenewalScript); SecureString ss = new SecureString(); for (int i = 0; i < Password.Length; i++) ss.AppendChar(Password.ElementAt(i)); PSCredential cred = new PSCredential(Username, ss); ps.AddParameter("Credential", cred); ps.AddParameter("BuildServer", Server); ps.AddParameter("CAServer", CAServer); ps.AddParameter("CAName", CAName); ps.Streams.Error.DataAdded += Error_DataAdded; var result=ps.BeginInvoke(null, output); } void output_DataAdded(object sender, DataAddedEventArgs e) { //display output in […]

如何确保Task.Delay更准确?

我有一个WPF应用程序,它广泛使用await和async方法。 有几个地方我叫await Task.Delay(…); 插入暂停。 但是我遇到的麻烦是虽然很多这些停顿都可以稍微偏离,但有些地方我绝对需要暂停才能准确。 换句话说,如果我调用await Task.Delay(2000); 在我的应用程序中有一些地方我需要保证它只会暂停2秒(而不是2.2秒)。 我相信问题来自于我确实有很多不同的异步方法,所以当我告诉其中一个延迟时,线程池中没有足够的线程,当它应该恢复活着时,结果,无意中,延迟比预期的更长。 当您的业务需要尽可能准确地延迟时,线程的C#“最佳实践”是什么? 很明显,异步方法似乎并不足够(即使它们很好阅读)。 我应该手动创建具有更高优先级的线程并使用Thread.Sleep吗? 我是否增加了线程池中的线程数? 我使用BackgroundWorker吗?

异步等待在调用异步方法时返回Task <List >而不是List

我试图了解异步等待的用法,我研究了一些博客文章,现在我已经制作了一个测试代码,但它没有按照我期望的方式工作。 我有一个返回List的方法: private List GetEmployees() { IList list = new List(); list.Add(new Employee() { Id = 1, Age = 20, Name = “Kavin” }); list.Add(new Employee() { Id = 2, Age = 30, Name = “Alen” }); list.Add(new Employee() { Id = 3, Age = 20, Name = “Suresh” }); list.Add(new Employee() { Id = […]

如何为WebClient.DownloadFileAsync捕获404 WebException

这段代码: try { _wcl.DownloadFile(url, currentFileName); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) if ((ex.Response as HttpWebResponse).StatusCode == HttpStatusCode.NotFound) Console.WriteLine(“\r{0} not found. “, currentFileName); } 下载文件并通知是否发生404错误。 我决定异步下载文件: try { _wcl.DownloadFileAsync(new Uri(url), currentFileName); } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null) if ((ex.Response as HttpWebResponse).StatusCode == […]