Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单独线程中运行的异步任务中的DynamicVoke?_C#_Reflection_Asynchronous_Windows Runtime - Fatal编程技术网

C# 在单独线程中运行的异步任务中的DynamicVoke?

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; 现在,为了让我的

我有一个通用方法,用于初始化T(WinRT)类型对象的同步线程。在此同步线程中,每当同步对象时,我都会调用委托处理程序,因此代码如下所示:

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
所做的只是通知线程池调度程序该任务正在长时间运行。您应该只使用
任务。运行