Domanda

codice completo:

using System;
using System.Linq;
using System.Activities;
using System.Activities.Statements;

namespace ManyAssemblies {

  class Program {

    public sealed class SayHelloActivity : Activity {
      readonly WriteLine writeLine = new WriteLine() { Text = "Hello Workflow 4" };
      public SayHelloActivity() {
        Implementation = () => { return writeLine; };
      }
    }


    static void Main(string[] args) {
      var wfDefinition = new SayHelloActivity();

      for (int i = 0; i < 100; i++) {
        WorkflowInvoker.Invoke(wfDefinition);
      }

      var allLoadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
      int wfAssemblesCount = allLoadedAssemblies
        .Where(a => a.FullName == 
"Workflow, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null").Count();
      Console.WriteLine(string.Format("There are {0} workflow assemblies in app domain.", wfAssemblesCount));
      Console.ReadLine();
    }
  }
}

L'output di questo codice:

...
Hello Workflow 4
Hello Workflow 4
Hello Workflow 4
There are 100 workflow assemblies in app domain.

Ogni esecuzione di definizione wf crea nuovo montaggio dinamico che viene caricato nel dominio applicazione corrente. Perché? Definizione è sempre lo stesso, quindi questo non è necessario, IMO. Si tratta di un difetto di progettazione in WF4? questo comportamento può essere controllato?

Sto costruendo una serie di istanze di workflow. E questo host deve essere attivo e funzionante per lungo tempo, come mesi. Sarò finire con il dominio applicazione con molte migliaia di assemblee dinamici, anche se ci sono solo alcune definizioni del flusso di lavoro solo? Sarà questo uccidere il mio prestazioni e utilizzare la mia memoria?

È stato utile?

Soluzione

Si scopre che questo è causa di debugger.

Se faccio funzionare il codice direttamente nel prompt dei comandi, in quel caso non ci fossero "Flusso di lavoro, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null" assiemi nel dominio applicazione.

Interessante il fatto che non c'è nessuno.

Questo significa che su ogni WorkflowInvoker.Invoke (wfDefinition); non v'è la costruzione di dinamica di montaggio che viene scaricato sulla concorrenza esempio?

Ma questo è un dettaglio di implementazione che, probabilmente, non influenza le prestazioni di un app wf.

Grazie per l'aiuto tilovell

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top