目标:调整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)
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次调用,因为它使用线程池,它将根据需要进行并行化.