1: using System;
2: using System.Collections.Generic;
3: using System.Linq;
4: using System.Text;
5: using System.Activities;
6: using System.Threading.Tasks;
7: using System.ComponentModel;
8: using Microsoft.VisualBasic.Activities;
9:
10: namespace ParallelActivities
11: {
12: [Designer(typeof(AsyncActivityWrapperDesigner))]
13: public class AsyncActivityWrapper : AsyncCodeActivity
14: {
15: public AsyncActivityWrapper()
16: {
17: Body = new ActivityAction();
18: }
19:
20: [Browsable(false)]
21: public ActivityAction Body { get; set; }
22:
23: protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
24: {
25: Activity activity = CreateDynamicActivity(context);
26: IDictionary<string,object> inputs = GetArgumentsAndVariables(context);
27: Task task = Task.Factory.StartNew((ignore) =>
28: {
29: WorkflowInvoker.Invoke(activity, inputs);
30:
31: }, state);
32: task.ContinueWith((t) => callback(t));
33: return task;
34: }
35:
36: protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result)
37: {
38: }
39:
40: private Activity CreateDynamicActivity(AsyncCodeActivityContext context)
41: {
42: DynamicActivity result = new DynamicActivity();
43: //Create a DynamicActivityProperty for each argument / variable in the current context
44: foreach (PropertyDescriptor property in context.DataContext.GetProperties())
45: {
46: DynamicActivityProperty dynamicActivityProperty = new DynamicActivityProperty();
47:
48: dynamicActivityProperty.Name = property.Name;
49: dynamicActivityProperty.Type = typeof(InArgument<>).MakeGenericType(property.PropertyType);
50: dynamicActivityProperty.Value = Activator.CreateInstance(dynamicActivityProperty.Type);
51: result.Properties.Add(dynamicActivityProperty);
52: }
53:
54: //Copy impors to dynamic activity;
55: VisualBasic.SetSettings(result, VisualBasic.GetSettings(this));
56: result.Implementation = () => Body.Handler;
57: return result;
58: }
59:
60: private IDictionary<string, object> GetArgumentsAndVariables(AsyncCodeActivityContext context)
61: {
62: IDictionary<string, object> result = new Dictionary<string, object>();
63:
64: foreach (PropertyDescriptor property in context.DataContext.GetProperties())
65: {
66: result.Add(property.Name, property.GetValue(context.DataContext));
67: }
68:
69: return result;
70: }
71: }
72: }