Я пытаюсь реализовать расширение деятельности WF4, которое будет обрабатывать некоторые длительные операции с данными и время от времени отправлять информацию обратно в «материнскую» деятельность.
Я реализовал версию этого, но у меня есть проблемы с ней, если я использую это действие в контексте параллельного действия. Как видно из приведенного ниже кода, действие создает закладку и после этого вызывает объект MyActivityExtension.
Я хочу, чтобы у каждого экземпляра класса MyActivity был свой экземпляр MyActivityExtension для связи. Если два действия этого типа используются последовательно в одном определении рабочего процесса, все работает нормально, и вызовы класса расширения выполняются для различных объектов, но если одно действие начинает выполнение, а другое бездействует, второе действие использует тот же экземпляр расширения, например бездействующий.
Ниже я добавил упрощенный пример своего кода. Любая идея, как я могу навязать непосредственное отношение между экземплярами деятельности и экземплярами расширения деятельности?
Заранее спасибо,
Alex
MyActivity код:
protected override void Execute(NativeActivityContext context)
{
//Some data processing....
//Obtain the activity extension
MyActivityExtension extension = context.GetExtension<MyActivityExtension >();
string bookmarkName = "MyActivity_" + Guid.NewGuid().ToString();
var bookmark = context.CreateBookmark(bookmarkName, BookmarkResumed);
extension.ProcessData(bookmarkName);
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
base.CacheMetadata(metadata);
metadata.AddDefaultExtensionProvider<MyActivityExtension >(() => new MyActivityExtension ());
}
private void BookmarkResumed(NativeActivityContext context, Bookmark bookmark, object value)
{
//some data retrieving operations
}
Код MyActivityExtension:
public class MyActivityExtension : IWorkflowInstanceExtension
{
private WorkflowInstanceProxy instance;
private Guid id;
public MyActivityExtension()
{
id = Guid.NewGuid();
}
internal void ProcessData(string bookmarkName)
{
Console.WriteLine("My activity extension Id: " + id.ToString());
//Some data processing
}
public IEnumerable<object> GetAdditionalExtensions()
{
return null;
}
public void SetInstance(WorkflowInstanceProxy instance)
{
this.instance = instance;
}
}