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

时间:2011-03-24 18:30:30

标签: 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);
}

1 个答案:

答案 0 :(得分:8)

IAsyncResult asyncResult = method.BeginInvoke("RBDB", null, null);
ISessionFactory sessionFactory = method.EndInvoke(asyncResult);

这不是平行的,来自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]); 
}

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