2

Visual Studio 2010のベータ2バージョンを使用して、WF4を使用して高度な学習を行っています。私はWF_WCF_SamplesSDKのSqlTrackingSampleを使用しており、追跡データを出力してSQLデータベースに格納する方法をかなりよく理解していますが、必要なときにデータをクエリする方法については何も見ていません。追跡データのクエリに使用される.Netクラスがあるかどうかを誰かが知っていますか?ある場合は、追跡データのクエリ方法を説明する既知のサンプル、チュートリアル、または記事がありますか?

4

3 に答える 3

1

MicrosoftWF4チームのMattWinklerによると、追跡データをクエリするための組み込みAPIはなく、開発者は自分で作成する必要があります。

于 2010-01-18T17:05:50.390 に答える
0

これらは役に立ちます:

于 2010-01-15T13:36:10.793 に答える
0

古い質問ですが、実際にはAppFabricには多かれ少なかれ公式のAPIがあります:WindowsServerAppFabricクラスライブラリ

実際のDLLは%SystemRoot%\ AppFabricで見つける必要があります(もちろん、AppFabricをインストールした後)。それを置くにはかなり奇妙な場所。

注目すべき主要なクラスは、SqlInstanceQueryProvider、InstanceQueryExecuteArgsです。クエリAPIは非同期であり、次のように使用できます(C#):

public InstanceInfo GetWorkflowInstanceInformation(Guid workflowInstanceId, string connectionString)
{
    var instanceQueryProvider = new SqlInstanceQueryProvider();

    // Connection string to the instance store needs to be set like this:
    var parameters = new NameValueCollection()
    {
        {"connectionString", connectionString}
    };
    instanceQueryProvider.Initialize("Provider", parameters);

    var queryArgs = new InstanceQueryExecuteArgs()
    {
        InstanceId = new List<Guid>() { workflowInstanceId }
    };

    // Total ruin the asynchronous advantages and use a Mutex to lock on.
    var waitEvent = new ManualResetEvent(false);
    IEnumerable<InstanceInfo> retrievedInstanceInfos = null;
    var query = instanceQueryProvider.CreateInstanceQuery();
    query.BeginExecuteQuery(
        queryArgs,
        TimeSpan.FromSeconds(10),
        ar =>
        {
            lock (synchronizer)
            {
                retrievedInstanceInfos = query.EndExecuteQuery(ar).ToList();
            }
            waitEvent.Set();
        },
        null);

    var waitResult = waitEvent.WaitOne(5000);
    if (waitResult)
    {
        List<InstanceInfo> instances = null;
        lock (synchronizer)
        {
            if (retrievedInstanceInfos != null)
            {
                instances = retrievedInstanceInfos.ToList();
            }
        }

        if (instances != null)
        {
            if (instances.Count() == 1)
            {
                return instances.Single();
            }

            if (!instances.Any())
            {
                Log.Warning("Request for non-existing WorkflowInstanceInfo: {0}.", workflowInstanceId);
                return null;
            }

            Log.Error("More than one(!) WorkflowInstanceInfo for id: {0}.", workflowInstanceId);
        }
    }

    Log.Error("Time out retrieving information for id: {0}.", workflowInstanceId);
    return null;
}

明確にするために、これでは、監視データベースに保存されている追跡データにアクセスすることはできません。このAPIは、永続データベース専用です。

于 2012-09-04T10:58:33.770 に答える