【发布时间】:2015-10-09 05:09:02
【问题描述】:
我正在开发需要提高性能的遗留应用程序(winform 应用程序)。
在这个应用程序中,我们使用 MVP 模式和 Shell 使用反射来查找它需要调用哪个 Presenter 以满足用户请求。所以有一个功能可以完成以下任务......
- 找到合适的演示者
- 遍历所有方法以找出默认方法引用。
- 为方法的参数输入准备一个数组
- 在presenter上调用默认方法
- 返回演示者参考
这里有一些代码...
public object FindPresenter(Type pType, string action, Dictionary<string, object> paramDictonary, string callerName = null)
{
if (pType == null)
{
throw new ArgumentNullException("presenterType");
}
var presenterTypeName = pType.Name;
var presenter = _presenterFactory.Create(pType);
presenter.CallerName = callerName;
if (presenter == null)
{
throw new SomeException(string.Format("Unable to resolve presenter"));
}
// Check each interface for the named method
MethodInfo method = null;
foreach (var i in presenter.GetType().GetInterfaces())
{
method = i.GetMethod(action, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance);
if (method != null) break;
}
if (method == null)
{
throw new SomeException(string.Format("No action method found"));
}
// Match up parameters
var par = method.GetParameters();
object[] results = null;
if (paramDictonary != null)
{
if (par.Length != paramDictonary.Count)
throw new ArgumentException(
"Parameter mis-match");
results = (from d in paramDictonary
join p in par on d.Key equals p.Name
orderby p.Position
select d.Value).ToArray();
}
// Attach release action
presenter.ReleaseAction = () => _presenterFactory.Release(presenter);
// Invoke target method
method.Invoke(presenter, results);
return presenter;
}
此方法大约需要 15-20 秒才能完成并冻结 UI。我想用一些异步处理来反射这个方法,所以在这个方法期间 UI 不会冻结。由于我需要返回演示者参考,我想到了使用 wait() 或 join() 方法,但它们会再次锁定 UI。
请注意,我使用的是 .NET 4.0。
【问题讨论】:
-
我的问题是如何通过将一些不锁定 UI 的任务放在后台来反映这一点。
-
您可以使用单独的线程来完成所有过程,然后更新 UI。为什么要在 UI 线程上等待。
-
我可以这样做...但问题出在此方法的末尾,我需要返回演示者参考...如果我为所有这些工作安排新线程,演示者参考将不会可以退货。
标签: c# winforms asynchronous reflection