I am working on legacy application (winform App) where I need to improve performance.
In this application, we are using MVP pattern and Shell usage reflection to find which presenter it needs to call in order to satisfied the user request. So there is a function which do the following tasks...
- Find the appropriate presenter
- Itrate through it's all methods to find out default method reference.
- prepare an array for method's parameter inputs
- Call the default method on presenter
- return the presenter reference
here is some code...
 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;
        }
This method take around 15-20 second to complete and freeze the UI. I want to refector this method with some async processing so UI is not freeze during this method. As I need to return presenter reference, I thought of using wait() or join() method, but they will again lock the UI.
Please note, I am using .NET 4.0.
 
     
     
    