2011-03-15 7 views
1

활동이 장기간 지속되는 경우 (이 아닌 외부 소스의 응답을 기다리는 활동 인) 해당 활동의 진행 상황을보고하고자합니다. 그러나, 나는 이것을 작동시킬 수 없다. 나는 두 가지 방법으로 ProgressActivity를 구현하려고했습니다Windows Workflow 4 - 레코드를 추적하는 시점은 언제입니까?

class Program 
{ 
    static void Main(string[] args) 
    { 
     var wfApp = new WorkflowApplication(new ActivityLibrary.ProgressActivity()); 

     var autoResetEvent = new AutoResetEvent(false); 
     wfApp.Completed = e => autoResetEvent.Set(); 
     wfApp.Extensions.Add(new ConsoleTrackingParticipant()); 
     wfApp.Run(); 
     autoResetEvent.WaitOne(); 

     Console.WriteLine("Done"); 
     Console.ReadLine(); 
    } 
} 

internal class ConsoleTrackingParticipant : TrackingParticipant 
{ 
    protected override void Track(TrackingRecord record, TimeSpan timeout) 
    { 
     Console.WriteLine(record.EventTime.ToString()); 
    } 
} 

:

나는 활동을 실행하는 간단한 콘솔 응용 프로그램을 가지고있다. 우선은 CodeActivity에서 파생 시도,하지만 난이 구현을 사용하면 워크 플로가 완료되면 (보고 record.EventTime가 정확하지만) 나는 함께 모든 사용자 추적 레코드가 나타납니다

public sealed class ProgressActivity : CodeActivity 
{ 
    protected override void Execute(CodeActivityContext context) 
    { 
     for (var i = 0; i <= 10; i++) 
     { 
      var customTrackingRecord = new CustomTrackingRecord("ProgressTrackingRecord") 
       { 
        Data = { { "Progress", i * 10.0 }} 
       }; 

      context.Track(customTrackingRecord); 
      Thread.Sleep(1000); 
     } 
    } 
} 

내가 다음 AsyncCodeActivity에서 파생 시도 하지만이 경우에는 내가 "경우 ObjectDisposedException : 측정 ActivityContext은 그것으로 전달 된 함수의 범위 내에서 액세스 할 수 있습니다"얻을 context.Track 라인에 : 나는 갔어요 곳

public sealed class ProgressActivity : AsyncCodeActivity 
{ 
    protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) 
    { 
     Action action =() => 
      { 
       for (var i = 0; i <= 10; i++) 
       { 
        var customTrackingRecord = new CustomTrackingRecord("ProgressTrackingRecord") 
        { 
         Data = { { "Progress", i * 10.0 } } 
        }; 

        context.Track(customTrackingRecord); 
        Thread.Sleep(1000); 
       } 
      }; 

     context.UserState = action; 
     return action.BeginInvoke(callback, state); 
    } 

    protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) 
    { 
     ((Action)context.UserState).EndInvoke(result); 
    } 
} 

는 사람이 설명 할 수 잘못된?

P. 워크 플로우가 서버에서 실행될 것이라면 내가 제시 한 접근 방식은 잘 확장되지 않지만, 현재 구축중인 애플리케이션은 데스크톱 애플리케이션입니다.

[편집] 실제로 여기에 더 넓은 질문을 던지고 있습니다. 워크 플로 실행 엔진에서 내 보낸 레코드를 추적 할 때가 있습니까? 내 조사에 따르면 활동이 완료되면 후에 특정 활동에 대한 모든 기록이 으로 배출됩니다. 활동을 수행하는 동안 강제로 배출되도록하는 방법이 있습니까?

답변

1

또한 MSDN 워크 플로 포럼에서이 질문을했으며 거기에서받은 의견을 토대로 추가 조사를 직접했습니다. 결과적으로 활동이 완료되면 또는이 북마크됨을 알 수 있습니다. 자세한 내용은 http://social.msdn.microsoft.com/Forums/en-US/wfprerelease/thread/8ce5dee9-9a19-4445-ad7f-33e181ec228b을 참조하십시오.

+0

더 정확한 설명은 워크 플로가있을 때 추적 레코드가 방출된다는 것입니다 스케줄러의 현재 작업 항목이 없습니다. 활동이 완료되거나 책갈피가되어 유휴 상태가되어 복원 대기 중일 때입니다. 나는 처음에 예정된 시간에 추적 기록을 켜는 옵션이 있다고 생각한다. –

+0

팀, 그 옵션이 무엇인지 알고 싶습니다! 이런 종류의 정보를 찾는 것이 매우 어렵습니다. – Akash

1

TrackingParticipant의 부작용 일 수 있습니다. TrackingParticipant를 확장하지 않고 차이가 있는지 확인하십시오.

워크 플로 확장은 기본 클래스를 확장하거나 인터페이스를 구현하지 않아도됩니다. 모든 오브젝트는 확장자가 될 수 있습니다.

나는 어떤 것에서도 확장되지 않는 확장 기능을 만들었으며 워크 플로 수명 동안 예상대로 작동합니다.

+0

그런데 확장 프로그램이 진행 정보가 포함 된 맞춤 추적 기록에 어떻게 액세스합니까? 나는 워크 플로우 확장에 대해 많이 모른다 ... – Akash

+0

아, 내가 가지고 있다고 생각해. 액티비티에서 호출 할 수있는 ReportProgress (이중 진행) 메서드를 사용하여 ProgressExtension을 만들 수 있습니다. 맞춤 추적 기록이 필요 없습니다. – Akash

+0

ProgressExtension 접근법을 통해 활동 실행 중에 진행 상태를보고 할 수 있지만 활동의 시작, 실행, 완료, 완료에 대한 기본 추적 레코드가 활동이 완료 될 때까지 계속 게시된다는 문제가 있습니다. 이러한 다양한 소스의 데이터를 조정하는 데 어려움이 있습니다. 확장은 활동이 실행 중임을 알려주지 만 추적 레코드는 활동이 아직 시작되지 않았 음을 알려줍니다. – Akash

1

AsyncCodeActivity를 사용하면 활동이 시작될 때 추적 레코드가 강제로 처리 될 수있었습니다.

protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state) 
    { 
     CustomTrackingRecord customRecord = new CustomTrackingRecord("Start") 
     { 
      Data = 
      { 
      {"Date", DateTime.Now.ToShortDateString()}, 
      } 
     }; 

     context.Track(customRecord); 


     var executeDelegate = new Action(FakeWork); 
     context.UserState = executeDelegate; 
     return executeDelegate.BeginInvoke(callback, state); 

    } 

    private void FakeWork() { 
     // do nothing 
     // This allows the CustomTrackingRecord to be handled by the WorkFlowTracker 
     // so that we can identify the start of the activity. 
     // The real work is done synchronously in the EndExecute method. 
    } 

    protected override void EndExecute(AsyncCodeActivityContext context, IAsyncResult result) { 

     var executeDelegate = (Action)context.UserState; 
     executeDelegate.EndInvoke(result); 

     Execute(context); 
    } 

    protected void Execute(CodeActivityContext context) 
    { 
     // Do Work 
    } 
+0

니스. WWF를 사용하여 더 이상 개발하지 않지만이 작업을 즐겨 찾기에 추가하는 방식보다 훨씬 간단합니다. – Akash

관련 문제