这段代码实际上是多线程的吗?

Kyl*_*vak 5 c# multithreading

目标:调整20个线程,这些线程将SessionFactory.GetSessionFactory(key)同时用于测试目的.(我正在尝试模拟ASP.NET等多线程环境)

问题:通过使用EndInvoke()方法,我实际上是GetSessionFactory(key)同步调用方法,还是我的代码在模拟多个线程GetSessionFactory(key)同时同时命中时是否正确?

谢谢,

凯尔

public void StressGetSessionFactory()
{
    for (int i = 0; i < 20; i++)
    {
        Func<string, ISessionFactory> method = GetSessionFactory;
        IAsyncResult asyncResult = method.BeginInvoke("RBDB", null, null);
        ISessionFactory sessionFactory = method.EndInvoke(asyncResult); //My concern is with this call

        Debug.WriteLine("RBDB ISessionFactory ID: " + sessionFactory.GetHashCode());
    }

}

static ISessionFactory GetSessionFactory(string key)
{
    return SessionFactory.GetSessionFactory(key);
}
Run Code Online (Sandbox Code Playgroud)

Bro*_*ass 8

IAsyncResult asyncResult = method.BeginInvoke("RBDB", null, null);
ISessionFactory sessionFactory = method.EndInvoke(asyncResult);
Run Code Online (Sandbox Code Playgroud)

MSDN来看,这不是平行的:

EndInvoke方法用于检索异步调用的结果.它可以在BeginInvoke之后的任何时候调用; 如果异步调用尚未完成,EndInvoke将阻塞直到它完成.

要进行并行调用,您可以使用更高级别的抽象(如TPL,即几乎可以免费提供所有这些)或稍微重构您的代码 - 首先进行异步调用,然后收集结果(未经测试):

IAsyncResult[] asyncResult = new IAsyncResult[20];
ISessionFactory[] sessionFactories = new ISessionFactory[20];
Func<string, ISessionFactory> method = GetSessionFactory;
for (int i = 0; i < 20; i++)
{
    asyncResult[i] = method.BeginInvoke("RBDB", null, null);
}
for(int i = 0; i < 20; i++)
{
    sessionFactories[i] = method.EndInvoke(asyncResult[i]); 
}
Run Code Online (Sandbox Code Playgroud)

请注意,BeginInvoke()您无法保证您实际上并行进行了20次调用,因为它使用线程池,它将根据需要进行并行化.