在实现微线程时第一个要解决的问题就是统一处理异步、同步阻塞和同步非阻塞操作。异步和同步阻塞操作都需要借助外部线程处理并通过回调函数获得执行结果。当然了对于同步的情况你可以把交给线程/线程池执行的方法看做回调函数。而对于同步非阻塞操作因为它不必借助外部线程而直接运行在微线程的宿主线程中,所以我们需要借助协程(yield)来“阻塞”它一下以便其他的微线程有运行的机会。因此我定义了一个接口来统一处理这个问题:
public interface INonBlock
{
//是否同步非阻塞
bool IsSync { get; }
//唯一编号
Guid Id { get; }
//异步执行
void AsyncInvoke();
//同步执行
IEnumerable<INonBlock> SyncInvoke();
}
然后我再定义一个抽象类对该接口进一步包装:
public abstract class NonBlock : INonBlock
{
Guid _id;
//同步执行时需要的空操作,用于让出时间片
Nop _nop;
protected virtual bool IsSync
{
get { return false; }
}
//异步、同步阻塞执行后的结果
public object NonBlockResult { get; private set; }
public NonBlock()
{
_id = Guid.NewGuid();
_nop = new Nop();
}
//同步,异步执行后利用此函数通知宿主线程任务完成
protected void Finish(object result)
协程与微线程——实现篇
最新推荐文章于 2023-04-21 14:47:56 发布
本文探讨了在实现微线程时如何统一处理异步、同步阻塞和同步非阻塞操作。通过定义INonBlock接口和NonBlock抽象类,实现了微线程的核心功能,包括异步和同步执行的调度。Tasklets类则负责执行和调度这些任务,通过CoroutineStart方法启动并管理微线程的执行流程。微线程的本质是一系列INonBlock对象的迭代和协作。
摘要由CSDN通过智能技术生成