1.在WF4中当我们使用WorkflowApplication来执行工作流的时候,工作流会以异步的方式执行,我们可以简单的写个例子来证明,工作流设置如下:
宿主如下:
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1());
Console.WriteLine("开始启动工作流");
wfApp.Run();
Console.WriteLine("工作流执行结束");
执行结果如下:
2.每个工作流实例会新建一个线程来异步执行,以前我们一般都会使用信号量来控制以达到同步的效果,这我在以前的很多文章中有写到,但这并不是真正的不同执行,在WF4中我们可以通过设置WorkflowApplication的SynchronizationContext属性来工作流同步执行,我们首先要增加一个类,如下:
class SynchronousSynchronizationContext : SynchronizationContext
{
public override void Post(SendOrPostCallback d, object state)
{ d(state); }
}
我们重写了SynchronizationContext的Post方法,如果你反编译该基类的Post方法你就可以看出是通过线程池来实现的 post是从线程池新启动一个线程执行,如下:
public virtual void Post(SendOrPostCallback d, Object state)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(d), state);
}
我们只需要在工作流设置添加一行代码既可:
wfApp.SynchronizationContext = new SynchronousSynchronizationContext();
结果就不一样了,如下:
3.我们来看下Long running的workflow,首先自定义一个Activity,如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Activities;
namespace CaryWFAppTest1
{
public sealed class LongRunningActivity : NativeActivity
{
protected override bool CanInduceIdle
{
get { return true; }
}
protected override void Execute(NativeActivityContext context)
{
Console.WriteLine("执行LongRunning逻辑,等待完成...");
context.CreateBookmark("激活", CompletedCallBack);
}
private void CompletedCallBack(NativeActivityContext context, Bookmark bookmark, object value)
{
Console.WriteLine("LongRunning逻辑执行完成");
}
}
}
工作流设计如下:
宿主代码如下:
WorkflowApplication wfApp = new WorkflowApplication(new Workflow1());
wfApp.SynchronizationContext = new SynchronousSynchronizationContext();
wfApp.Idle = e => Console.WriteLine("触发工作流空闲事件");
Console.WriteLine("开始启动工作流");
wfApp.Run();
Console.WriteLine("工作流进入空闲状态");
Console.WriteLine();
Console.WriteLine("开始恢复工作流");
Console.WriteLine("恢复工作流: {0}", wfApp.ResumeBookmark("激活", null));
Console.WriteLine("工作流执行结束");
Console.ReadLine();
执行结果如下:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器