目标:启动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);
}
答案 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次调用,因为它使用了线程池,它将根据需要进行并行化。