Tag: 异步

同步执行异步function

我已就此主题进行了大量搜索,并且我在此网站上阅读了有关此主题的大部分post,但我仍然感到困惑,我需要一个直接的答案。 这是我的情况: 我有一个已建立的Winform应用程序,我无法将其全部“异步”。 我现在被迫使用一个全部写为异步函数的外部库。 在我的申请中,我有 /// /// This function I can’t change it to an ‘async’ /// public void MySyncFunction() { //This function is my point in my application where I have to call the //other ‘async’ functions but I can’t change the function itself to ‘async’ try { //I need to call the MyAsyncDriverFunction() […]

不断监控流程

我编写了一些监视正在运行的Windows进程的代码。 我想知道某个过程何时开始以及何时结束。 代码就像我想要的那样工作。 现在,我希望在Windows窗体服务器应用程序中实现它 – 所以只要表单处于活动状态,它就会在循环中运行。 我想我应该让它可以使用BackgroundWorker异步运行。 我只是不确定最好的方法是什么以及如何做到这一点。 这是我的监视器代码: using System; using System.Management; using System.Diagnostics; using System.Collections.Generic; using System.ComponentModel; class ProcessMonitor { public static void Main() { Dictionary newProcs= new Dictionary (); while (true) { foreach (Process process in Process.GetProcesses()) { if (process.ProcessName.CompareTo(“Someprocess”) == 0) { if (!searchForProcess(newProcs, process.Id)) { ManagementObjectSearcher searcher = new ManagementObjectSearcher(“SELECT […]

使用异步套接字的多个套接字连接

我有以下代码,使TCP套接字连接到多个端点,如下所示: private async void button1_Click(object sender, EventArgs e) { var listofIps = new List { “192.168.168.193”, “192.168.168.221” }; foreach (var ip in listofIps) { IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(ip), 4001); Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); sockets.Add(client); await client.ConnectTaskAsync(remoteEP); await ReadAsync(client); } } async Task ReadAsync(Socket s) { var args = new SocketAsyncEventArgs(); args.SetBuffer(new […]

winforms的异步加载

在(Android)应用程序中,在用户与界面交互时加载和构建ListView是很常见的。 然而,在Winforms中,趋势似乎是在用户可以继续浏览应用程序之前单击按钮并等待结果完全加载。 由于我目前使用的数据库访问速度很慢,我想在异步方法中使用数据库,以使用户能够与接口保持交互,而数据未完全加载和显示。 例如,我想在我的Form_Load事件中启动一个异步方法来继续收集数据。 当此方法完成时,我想将数据绑定到某些控件 – 这将(暂时)不会更改function。 因此,我希望用户在处理应用程序时不要注意到任何差异(除了显示或不显示数据)。 我应该在哪里放置await关键字来实现这一目标? 我不能将它放在我的Load事件中,因为这需要完成以使应用程序“正常”运行。 甚至可以使用异步方法让Windows窗体完全反应,而不是所有方法都完成,或者我是否正在为我的目的查看“错误”function? 先感谢您。 编辑:在Srirams提示之后,我将load-event本身设为异步子,效果很好。 这是一些显示所需行为的简单示例代码: Public Class DelayedLoadingWindow Private Async Sub DelayedLoadingWindow_Load(sender As Object, e As EventArgs) Handles MyBase.Load Dim awaitedResultOne As Task(Of String) = GetDataOneAsync() Label1.Text = Await awaitedResultOne Dim awaitedResultTwo As Task(Of String) = GetDataTwoAsync() Label2.Text = Await GetDataTwoAsync() Dim awaitedResultThree As Task(Of String) […]

为什么我在20%繁忙的机器上得到IPC延迟

我在一台拥有10个内核且运行47个ClientApp实例的机器上的IPC出现延迟,这些实例都与MasterApp通信。 我偶尔会遇到严重的延迟。 这是我的日志的一部分。 左边的DateTime是日志DateTime(高性能记录器)。 []中的DateTimes是从MasterApp发送消息的时间。 每条消息都以@结尾。 所以第一条消息仅落后1毫秒,但最后消息落后71毫秒。 任何可能导致这种情况的想法以及我可以做些什么来消除延迟 20141030T120401.015 [——–*MD|USD/JPY 109.032 109.034 1000000.00 1000000.00 20141030T120401014@] 20141030T120401.084 [——–*MD|EUR/CHF 1.20580 1.20588 3000000.00 2000000.00 20141030T120401019@] 20141030T120401.163 [——–*MD|USD/JPY 109.031 109.034 1000000.00 1000000.00 20141030T120401088@*MD|EUR/CHF 1.20580 1.20588 3000000.00 1000000.00 20141030T120401092@] 代码摘录: public void Connect(int port) { IPAddress[] aryLocalAddr = null; String strHostName = “”; try { // NOTE: DNS lookups are […]

Web服务意外地同步运行

我们有一个需要连接到慢速数据库进程并将值返回给客户端的Web服务,因此尝试异步运行它以阻止它阻塞线程。 但是,如果我们进行两次调用,它们会按顺序运行,而不是异步运行。 呼叫1在5秒后返回,在10后呼叫2,在15后呼叫3,依此类推。 这是(简化测试版)代码 – public class ImportAsyncController : AsyncController { [HttpPost] [Authorize(Roles = “Admin, ContentAdmin, ContentEdit”)] public async Task SlowProcess() { await Task.Delay(5000); return “Hello, world!”; } } IIS 7.5,默认设置。 遗产项目所以并非完全不可能,项目文件中的某些内容会强制它,但不知道是什么,抱歉。 作为参考,从中调用的实际代码调用SQL服务器sproc。 它在内部使用sp_getapplock进行并发逻辑,并在SSMS中运行时正确返回 – 调用1运行完成,如果调用1仍在运行,则调用> 1返回错误代码,否则返回自身完成。 那个逻辑很好; 问题实际上是在队列中按顺序处理Web请求,因此在调用1完成之前,甚至不会调用call> 1。 我们做错了什么?

在同步的asp.net控制器中使用Task.Run

是否有一种有效的方法来下载文件并以“后台”方式将其保存在磁盘上,而不会阻止mvc控制器中当前执行的操作? 目前我有以下示例代码工作: public ActionResult Index() { InitiateDownload(); var model = GetModel(); return View(model); } private void InitiateDownload() { Task.Run(() => DownloadAndSaveFileAsync()).ConfigureAwait(false); } private async Task DownloadAndSaveFileAsync() { var response = await GetResponse(); using (var fileStream = new FileStream(“c:\\file.zip”, FileMode.Create, FileAccess.Write, FileShare.None)) { await response.Content.CopyToAsync(fileStream).ConfigureAwait(false); } } public async Task GetResponse() { var client = new […]

异步方法,包括对结果的异步调用和同步操作

我正在尝试创建一个异步方法,我可以多次调用并等待以后 – 该方法应该进行数据库调用,等待结果,一旦有结果就做一些操作,然后返回最终结果。 它看起来像这样: public async Task GetSomethingFromDbAndSelectSomethingOnServer() { //stuff is just an Entity Framework database call var stuff = await myEfDbContext.StuffTable.ToListAsync(); long itemsCount = stuff.Where(someQueryThatCantGoToDb).Count(); return itemsCount; } 这似乎是一个明显的错误,因为我将返回类型指定为Task,而实际上我只返回了很长时间。 这会编译,但抛出exception: EntityFramework.dll中发生了’System.NotSupportedException’类型的第一次机会exception 我打算像这样使用这个代码: Task myAsyncCall = GetSomethingFromDbAndSelectSomethingOnServer(); long myCount = await myAsyncCall; 这可能有点无关紧要,但是为了详细说明,这里有一些好处: Task pendingItemCountCall = _mongoItems.Find(filter).CountAsync(); long myCount2 = await pendingItemCountCall; 当然,区别在于它只是对db的异步调用,没有进一步的操作,我正在尝试在SQL调用中执行此问题。 编辑: 所以,实际上,这似乎是违规行: […]

从WCF服务调用基于任务的异步单向回调方法

我有一个WCF服务,它使用回调合同来通知客户端,类似于此 public interface IClientCallback { [OperationContract(IsOneWay = true)] void NotifySomething(); } 和调用它的服务代码类似于此 void NotifySomething() { try { this.callback.NotifySomething(); } catch (Exception ex) { // Log the exception and eat it } } 请注意,根据设计,回调通知是可选的 ,即很好,但不是必需的。 这就是为什么它被标记为OneWay并且实现吃exception。 由于一些误解,我们认为这对于拥有一个非阻塞的火灾和忘记方法就足够了。 但当然这不是真的,所以在某些情况下它会阻塞一段时间,这会导致问题,因为它是从内部线程同步块调用的。 因此,我们决定通过更改定义使其异步,如下所示 public interface IClientCallback { [OperationContract(IsOneWay = true)] Task NotifySomething(); } 我对客户端实现没有问题,我的问题是如何从服务中调用它。 这是我正在考虑的事情 async void NotifySomething() { try […]

async和await不起作用

我正在尝试学习async并等待.NET 4.5的function。首先,这是我的代码 static async void Method() { await Task.Run(new Action(DoSomeProcess)); Console.WriteLine(“All Methods have been executed”); } static void DoSomeProcess() { System.Threading.Thread.Sleep(3000); } static void Main(string[] args) { Method(); //Console.WriteLine(“Method Started”); Console.ReadKey(); } 此代码不会在控制台上给我任何结果。 我不明白为什么。 我的意思是不是任务假设只是没有阻塞的线程。 但是,如果我在main方法中取消注释Console.WriteLine(),一切似乎都正常工作。 谁能告诉我这里发生了什么?