Windows Workflow Foundation 4.0和跟踪

时间:2010-01-15 13:25:01

标签: windows workflow-foundation tracking

我正在使用Visual Studio 2010的Beta 2版本来使用WF4进行一些高级学习。我一直在使用WF_WCF_Samples SDK中的SqlTracking示例,并且已经非常了解如何在SQL数据库中发出和存储跟踪数据,但是在需要时还没有看到任何关于如何查询数据的信息。有没有人知道是否有任何.Net类用于查询跟踪数据,如果有的话,是否有任何已知的样本,教程或文章描述如何查询跟踪数据?

3 个答案:

答案 0 :(得分:1)

来自Microsoft WF4团队的Matt Winkler表示,没有任何用于查询跟踪数据的内置API,开发人员必须自己编写。

答案 1 :(得分:0)

答案 2 :(得分:0)

老问题,我知道,但AppFabric中实际上有一个或多或少的官方API:Windows Server AppFabric Class Library

您必须在%SystemRoot%\ AppFabric中找到实际的DLL(当然,在安装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仅适用于持久性数据库。