TransferênciaTransfer

Este tópico descreve a transferência no modelo de rastreamento de atividades do Windows Communication Foundation (WCF).This topic describes transfer in the Windows Communication Foundation (WCF) activity tracing model.

Definição de transferênciaTransfer Definition

As transferências entre as atividades representam as relações causal entre os eventos nas atividades relacionadas nos pontos de extremidade.Transfers between activities represent causal relationships between events in the related activities within endpoints. Duas atividades estão relacionadas com transferências quando os fluxos de controle entre essas atividades, por exemplo, uma chamada de método que atravessa limites de atividade.Two activities are related with transfers when control flows between these activities, for example, a method call crossing activity boundaries. No WCF, quando bytes são recebidos no serviço, a atividade escutar na é transferida para a atividade receber bytes em que o objeto de mensagem é criado.In WCF, when bytes are incoming on the service, the Listen At activity is transferred to the Receive Bytes activity where the message object is created. Para obter uma lista de cenários de rastreamento de ponta a ponta e suas respectivas atividades e design de rastreamento, consulte cenários de rastreamento de ponta a ponta.For a list of end-to-end tracing scenarios, and their respective activity and tracing design, see End-To-End Tracing Scenarios.

Para emitir rastreamentos de transferência, use a ActivityTracing configuração na origem do rastreamento, conforme demonstrado pelo código de configuração a seguir.To emit transfer traces, use the ActivityTracing setting on the trace source as demonstrated by the following configuration code.

<source name="System.ServiceModel" switchValue="Verbose,ActivityTracing">  

Usando a transferência para correlacionar atividades nos pontos de extremidadeUsing Transfer to Correlate Activities Within Endpoints

Atividades e transferências permitem que o usuário Probabilistic localize a causa raiz de um erro.Activities and transfers permit the user to probabilistically locate the root cause of an error. Por exemplo, se transferimos para frente e para trás entre as atividades M e N, respectivamente nos componentes M e N, e uma falha ocorre em N logo após a transferência de volta para M, podemos desenhar a conclusão de que é provável que a passagem de N dados volte para M.For example, if we transfer back and forth between activities M and N respectively in components M and N, and a crash happens in N right after the transfer back to M, we can draw the conclusion that it is likely due to N’s passing data back to M.

Um rastreamento de transferência é emitido da atividade M para a atividade N quando há um fluxo de controle entre M e N. Por exemplo, N executa algum trabalho para M devido a uma chamada de método que atravessa os limites das atividades.A transfer trace is emitted from activity M to activity N when there is a flow of control between M and N. For example, N performs some work for M because of a method call crossing the activities’ boundaries. N pode já existir ou ter sido criado.N may already exist or has been created. N é gerado por M quando N é uma nova atividade que executa algum trabalho para M.N is spawned by M when N is a new activity that performs some work for M.

Uma transferência de M para N pode não ser seguida de uma transferência de N para M. Isso ocorre porque M pode gerar algum trabalho em N e não rastrear quando N concluir esse trabalho.A transfer from M to N may not be followed by a transfer back from N to M. This is because M can spawn some work in N and do not track when N completes that work. Na verdade, M pode terminar antes de N concluir sua tarefa.In fact, M can terminate before N completes its task. Isso acontece na atividade "Open ServiceHost" (M) que gera atividades de ouvinte (N) e, em seguida, termina.This happens in the "Open ServiceHost" activity (M) that spawns Listener activities (N) and then terminates. Uma transferência de volta de N para M significa que N concluiu o trabalho relacionado a M.A transfer back from N to M means that N completed the work related to M.

N pode continuar executando outro processamento não relacionado a M, por exemplo, uma atividade de autenticador existente (N) que mantém o recebimento de solicitações de logon (M) de diferentes atividades de logon.N can continue performing other processing unrelated to M, for example, an existing authenticator activity (N) that keeps receiving login requests (M) from different login activities.

Uma relação de aninhamento não existe necessariamente entre as atividades M e N. Isso pode ocorrer devido a dois motivos.A nesting relationship does not necessarily exist between activities M and N. This can happen due to two reasons. Primeiro, quando a atividade M não monitora o processamento real executado em N, embora M iniciado N. Em segundo lugar, quando N já existir.First, when activity M does not monitor the actual processing performed in N although M initiated N. Second, when N already exists.

Exemplo de transferênciasExample of Transfers

O exemplo a seguir lista dois exemplos de transferência.The following lists two transfer examples.

  • Quando você cria um host de serviço, o Construtor Obtém o controle do código de chamada ou o código de chamada transfere para o construtor.When you create a service host, the constructor gains control from the calling code, or the calling code transfers to the constructor. Quando o Construtor conclui a execução, ele retorna o controle para o código de chamada ou o Construtor transfere de volta para o código de chamada.When the constructor has finished executing, it returns control to the calling code, or the constructor transfers back to the calling code. Esse é o caso de uma relação aninhada.This is the case of a nested relationship.

  • Quando um ouvinte inicia o processamento de dados de transporte, ele cria um novo thread e passa para a atividade receber bytes o contexto apropriado para processamento, passagem de controle e dados.When a listener starts processing transport data, it creates a new thread and hands to the Receive Bytes activity the appropriate context for processing, passing control and data. Quando esse thread terminar de processar a solicitação, a atividade receber bytes não passará nada de volta para o ouvinte.When that thread has finished processing the request, the Receive Bytes activity passes nothing back to the listener. Nesse caso, temos uma transferência no, mas nenhuma transferência para fora da nova atividade thread.In this case, we have a transfer in but no transfer out of the new thread activity. As duas atividades estão relacionadas, mas não aninhadas.The two activities are related but not nested.

Sequência de transferência de atividadeActivity Transfer Sequence

Uma sequência de transferência de atividade bem formada inclui as etapas a seguir.A well-formed activity transfer sequence includes the following steps.

  1. Inicie uma nova atividade, que consiste em selecionar um novo gAId.Begin a new activity, which consists of selecting a new gAId.

  2. Emitir um rastreamento de transferência para esse novo gAId da ID da atividade atualEmit a transfer trace to that new gAId from the current activity ID

  3. Definir a nova ID em TLSSet the new ID in TLS

  4. Emita um rastreamento de início para indicar o início da nova atividade pelo.Emit a start trace to indicate the beginning of the new activity by.

  5. Retornar à atividade original consiste no seguinte:Return to the original activity consists of the following:

  6. Emitir um rastreamento de transferência para o gAId originalEmit a transfer trace to the original gAId

  7. Emitir um rastreamento de interrupção para indicar o final da nova atividadeEmit a Stop trace to indicate the end of the new activity

  8. Defina TLS para o antigo gAId.Set TLS to the old gAId.

O exemplo de código a seguir demonstra como fazer isso.The following code example demonstrates how to do this. Este exemplo pressupõe que uma chamada de bloqueio é feita ao transferir para a nova atividade e inclui rastreamentos de suspensão/retomada.This sample assumes a blocking call is made when transferring to the new activity, and includes suspend/resume traces.

// 0. Create a trace source  
TraceSource ts = new TraceSource("myTS");  

// 1. remember existing ("ambient") activity for clean up  
Guid oldGuid = Trace.CorrelationManager.ActivityId;  
// this will be our new activity  
Guid newGuid = Guid.NewGuid();

// 2. call transfer, indicating that we are switching to the new AID  
ts.TraceTransfer(667, "Transferring.", newGuid);  

// 3. Suspend the current activity.  
ts.TraceEvent(TraceEventType.Suspend, 667, "Suspend: Activity " + i-1);  

// 4. set the new AID in TLS  
Trace.CorrelationManager.ActivityId = newGuid;  

// 5. Emit the start trace  
ts.TraceEvent(TraceEventType.Start, 667, "Boundary: Activity " + i);  

// trace something  
ts.TraceEvent(TraceEventType.Information, 667, "Hello from activity " + i);  

// Perform Work  
// some work.  
// Return  
ts.TraceEvent(TraceEventType.Information, 667, "Work complete on activity " + i);

// 6. Emit the transfer returning to the original activity  
ts.TraceTransfer(667, "Transferring Back.", oldGuid);  

// 7. Emit the End trace  
ts.TraceEvent(TraceEventType.Stop, 667, "Boundary: Activity " + i);  

// 8. Change the tls variable to the original AID  
Trace.CorrelationManager.ActivityId = oldGuid;

// 9. Resume the old activity  
ts.TraceEvent(TraceEventType.Resume, 667, "Resume: Activity " + i-1);  

Consulte tambémSee also