C#如何检查事件是不是异步执行

Posted

技术标签:

【中文标题】C#如何检查事件是不是异步执行【英文标题】:C# How check if event is executed asyncC#如何检查事件是否异步执行 【发布时间】:2019-02-19 06:19:39 【问题描述】:

我是事件的新手,我问自己一个被触发的事件(来自 SDK)是在主线程上执行还是在另一个线程上异步执行。

谁能帮我检查一下?

例如,如果事件触发并且它不阻塞 UI,则执行此操作,这让我感到惊讶(每 0.05 秒触发一次最大速度):

void TrackingOnNewTrackingObservations(object sender, TrackingEventArgs e)
    
        try
        
            dgvTracking.Rows[0].Cells["cName"].Value = "SlopeDistance";
            dgvTracking.Rows[0].Cells["cValue"].Value = string.Format("0:0.00 m", e.SlopeDistance);

            dgvTracking.Rows[1].Cells["cName"].Value = "HorizontalAngle";
            dgvTracking.Rows[1].Cells["cValue"].Value = string.Format("0:0.00000°", e.HorizontalAngle);

            dgvTracking.Rows[2].Cells["cName"].Value = "VerticalAngle";
            dgvTracking.Rows[2].Cells["cValue"].Value = string.Format("0:0.00000°", e.VerticalAngle);
        
        catch (Exception ex)
        
            Debug.WriteLine("Error TrackingOnNewTrackingObservations ->" + ex.Message);
        

【问题讨论】:

if (dgvTracking.InvokeRequired) /* Some other thread; use dgvTracking.Invoke(...) to assign dgvTracking properties */ else /* UI thread */ 异步并不意味着它在另一个线程上。 虽然它可能取决于底层架构@rory.ap。 asp.Net 异步调用将(可能)在返回时获取一个新线程 @Anon:您似乎在混合 TPL:Taskasyncawait 和裸 Threads。 DoSomethingAsync(...) 返回 Task 我们应该 await;类似private async void MyEventHandler(object sender, TrackingEventArgs e) ... var result = await DoSomethingAsync(...); ... @Anon:把IAsyncResult变成Task:docs.microsoft.com/en-us/dotnet/api/…tpodolak.com/blog/2016/02/12/… 【参考方案1】:

使用 Corewindow.Dispatcher.HasThreadAccess 测试执行是否在 UI 线程上。

通常,事件将在与导致事件的方法的调用相同的线程上被调用。如果该类是 UI 类,则它们将是 UI 线程。

【讨论】:

我所做的是:我将Thread.CurrentThread.ManagedThreadId 放入其中一个 UI 类的构造函数中。线程 ID 返回 8。我还将该行放入由事件触发的方法中,线程 ID 为9。所以我现在假设,它实际上创建了一个新线程,对吗? 我同意他们在不同的线程上。虽然测试线程 ID 似乎是合理的,但我真的建议坚持使用预定义的方法,即 HasThreadAccess。 好吧,似乎CoreWindow.Dispatcher 属性仅在我未使用的 UWP 框架中可用(WinForms .NET 4.0)。

以上是关于C#如何检查事件是不是异步执行的主要内容,如果未能解决你的问题,请参考以下文章

.NET 中是不是可以使用 C# 实现基于事件的异步模式而无需多线程?

C# Winform 多线程异步委托进度条

C#固定时间执行指定事件(观察者模式+异步委托)

如何检查 C# 中的库 (dll) 是不是可用?

跪请高手指教----- C# 页面按钮点击以后不触发后台事件,一般是啥原因?

c# 怎么阻止事件执行