在实现微线程时第一个要解决的问题就是统一处理异步、同步阻塞和同步非阻塞操作。异步和同步阻塞操作都需要借助外部线程处理并通过回调函数获得执行结果。当然了对于同步的情况你可以把交给线程/线程池执行的方法看做回调函数。而对于同步非阻塞操作因为它不必借助外部线程而直接运行在微线程的宿主线程中,所以我们需要借助协程(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)
协程与微线程——实现篇
最新推荐文章于 2021-11-13 14:23:57 发布