在Windows Workflow 4.5中将“ WriteLine”消息写入跟踪窗口

时间:2019-07-16 11:47:45

标签: c#-4.0 workflow-foundation-4

我正在使用WF 4.5的rehosted-designer为用户提供一个界面,以创建具有自定义活动和框架的某些内置活动的工作流。

我正在使用AsyncCodeActivity模型(完全适合我的要求),因此必须执行以下工作流,这意味着立即触发执行,而无法迭代工作流中的活动:

WorkflowApplication wf = new WorkflowApplication(activeFlowChart);
............
............
var result = wf.BeginRun(null,null);
while (!result.IsCompleted)
{
Thread.Sleep(1);
continue;
}
wf.EndRun(result);

我的工作流程可以在工作流程中分散多个“ WriteLine”活动。 我想检索特定“ WriteLine”的消息,并按照在工作流中的显示顺序来显示在跟踪窗口中。

我尝试如下完成操作,它显示了在执行结束时附加的所有“ WriteLine”消息:

wf.Extensions.Add(writer);
wf.Completed = arg =>
{
if (!string.IsNullOrEmpty(writer.ToString()))
{
//display
}
};

我正在寻找一种在工作流中而不是完成时立即获取“ WriteLine”消息的方法。

1 个答案:

答案 0 :(得分:0)

下面的链接帮助我考虑编写自定义TextWriter来解决上述用例:

Redirecting Console.WriteLine() to Textbox

我没有将字符附加到“ writer”对象上,而是在工作流完成时将其打印到显示窗口中(请参阅我的问题中的代码),而是编写了一个自定义TextWriter来打印每个“ WriteLine”活动的消息当遇到新行(“ \ r \ n”)时。下面的示例:

在构造函数中:

var writer = new WriteLineTextWriter(DisplayTraceMessage);
Console.SetOut(writer);

自定义TextWriter:

public class WriteLineTextWriter : TextWriter
{
private Action<string, Brush> WriteTraceMessageToGUI { get; set; }
private StringBuilder line;
private byte counter;

public WriteLineTextWriter(Action<string, Brush> action)
{
WriteTraceMessageToGUI = action;
line = new StringBuilder();
}

public override System.Text.Encoding Encoding
{
get { return System.Text.Encoding.Unicode; }
}

public override void Write(char value)
{
if (value == '\r' || value == '\n')
{
counter++;
}
else
{
line.Append(value.ToString());
}
if (counter == 2)
{
WriteTraceMessageToGUI(line.ToString(), Brushes.BlueViolet);
line.Clear();
counter = 0;
}
}

public override void Write(string value)
{
WriteTraceMessageToGUI(value, Brushes.BlueViolet);
}
}