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:Task
、async
、await
和裸 Thread
s。 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# 实现基于事件的异步模式而无需多线程?