C# 在单独线程中运行的异步任务中的DynamicVoke?
我有一个通用方法,用于初始化T(WinRT)类型对象的同步线程。在此同步线程中,每当同步对象时,我都会调用委托处理程序,因此代码如下所示:C# 在单独线程中运行的异步任务中的DynamicVoke?,c#,reflection,asynchronous,windows-runtime,C#,Reflection,Asynchronous,Windows Runtime,我有一个通用方法,用于初始化T(WinRT)类型对象的同步线程。在此同步线程中,每当同步对象时,我都会调用委托处理程序,因此代码如下所示: foreach (var e in updatedEntities) { if (mHandlers.ContainsKey(typeof(T))) { mHandlers[typeof(T)].DynamicInvoke(e); } } firstUpdate[typeof(T)] = true; 现在,为了让我的
foreach (var e in updatedEntities)
{
if (mHandlers.ContainsKey(typeof(T)))
{
mHandlers[typeof(T)].DynamicInvoke(e);
}
}
firstUpdate[typeof(T)] = true;
现在,为了让我的应用程序正常工作,我需要等待所有firstUpdate值都为true(默认情况下它们初始化为false)
我的问题是,即使处理程序的格式是:
public void EntityUpdated(SyncedDatatypes.MyEntityType entity)
DynamicInvoke似乎在单独的线程中运行,因为在完成DynamicInvoke背后的委托之前,firstUpdate设置为true
因此,由于它既不是一个任务也不是一个异步方法,我真的被这种行为弄糊涂了。如何确保我的所有处理程序都被调用过一次?i、 e.如何“等待”DynamicInvoke?
DynamicInvoke
不在单独的线程上运行。您的代码中可能存在其他类型的争用条件,或者您可能正在使用异步void EntityUpdated
。以前它是异步的,我将其更改为synchronous,但行为没有任何更改。我已经看过很多次了,很难想象是什么原因造成的。我能想到的一件事是,这是一项长期运行任务的一部分。为了启动它,我没有使用Task.Run,而是使用Task.Factory.StartNew(async()=>{…},TaskCreationOptions.longlunning);嗯,您知道StartNew
不理解async
,对吗?它会很早回来的。是的,我知道。我认为这适用于像await这样的东西,但显然DynamicVoke在这种情况下也有类似的效果。不过,有什么办法吗?因为我想最大限度地提高我的任务在单独线程中运行的机会,我唯一能看到的方法就是使用TaskCreationOptions.LongRunning。task.Run
将在单独的线程中运行。longlunning
所做的只是通知线程池调度程序该任务正在长时间运行。您应该只使用任务。运行。