美文网首页
{C#} 如何将事件回调包装成任务

{C#} 如何将事件回调包装成任务

作者: windflow | 来源:发表于2016-10-28 17:10 被阅读0次

早读课老师安排学生们读课文,突然老师想抽根烟,就跟班长说读完跑去告诉他。

public class ReadEventArgs : EventArgs
{
    public object State { get; set; }

    public int Length { get; set; }

    public List<ArraySegment<byte>> Content { get; set; }

    public event EventHandler<ReadEventArgs> Finished;
}

public class Student
{
    public void ReadAsync(ReadEventArgs eventArgs)
    {
        // 这个方法会很快返回。但是,在学生读书结束的时候,Finished事件会自动触发。
    }
}

public class Monitor
{
    private Student _student = new Student();
    public Task<bool> WatchStudentRead()
    {

    }
}

class Teacher
{
    Monitor _monitor = new Monitor();

    public async void Smoke()
    {
        var task = _monitor.WatchStudentRead();

        // smoking

        await task;

        // go back to classroom
    }
}

请问这里班长怎么做,才能实现异步任务? Student.ReadAsync实际上不是异步方法,不可以await,也不代表完成,这意味着 WatchStudentRead 内部创建task也是行不通的。

好在TPL神通广大,我们可以通过TaskCompletionSource来实现。 TaskCompletionSource可以只管理任务,但不运行实际任务。

    Monitor.cs
    public Task<bool> WatchStudentRead()
    {
        var tasksource = new TaskCompletionSource<bool>();

        var e = new ReadEventArgs();
        e.State = tasksource;
        e.Finished += OnReadFinished;

        _student.ReadAsync(e);

        return tasksource.Task;
    }

    private void OnReadFinished(object sender, ReadEventArgs e)
    {
        var tasksource = e.State as TaskCompletionSource<bool>;

        if (tasksource != null)
        {
            tasksource.SetResult(e.Length > 0);
        }
    }

怎么样,是不是很有趣,返回的task并没有做实际工作,只是在等待结果。
这种场景挺常见,值得注意。

相关文章

  • {C#} 如何将事件回调包装成任务

    早读课老师安排学生们读课文,突然老师想抽根烟,就跟班长说读完跑去告诉他。 请问这里班长怎么做,才能实现异步任务? ...

  • 先入为主,贼喊捉贼

    《中国新闻网》8月11日报道了河南考生答题卡调包事件的调查结果,原标题:河南通报答题卡被调包:不存在调包和模仿笔迹...

  • 如何解除高考答题卡调包的怀疑

    近两日河南省考生高考答题卡被调包的事件,成为了一个朋友圈的热门事件。 高考答题卡调包事件起因是河南的四位家长质疑考...

  • C# 高级语言总结

    后续 1 C# 委托 委托(Delegate)特别用于实现事件和回调方法。所有的委托(Delegate)都派生自 ...

  • Activity的启动过程

    上一篇我们已经发分析了Launcher启动起来后,如何将应用程序封装成桌面图标,并设置了点击事件监听的整个流程。当...

  • 今年的夏天不一样

    从疫苗事件,大使馆事件,右安门事件,P2P事件,答题卡调包事件,真是一件接一件,让这个炎热的夏天更加烦躁不安

  • unity & C#相关

    事件和委托 C#事件和Unity3d - CSDN博客 Unity常用的函数和遇到的C#的知识整理 Unity常用...

  • 动画骨骼

    Spine.AnimationState为动画提供了C#事件的回调功能。你可以使用这些来处理一些基本的动画播放。 ...

  • 中高级前端面试题

    事件循环机制 同步:执行栈 异步:任务队列 1.宏任务 点击回调 settimeout 2.微任务 当前task执...

  • JS中的事件循环

    宏任务 包括:包含执行整体的js代码,事件回调,XHR回调,定时器(setTimeout/setInterval/...

网友评论

      本文标题:{C#} 如何将事件回调包装成任务

      本文链接:https://www.haomeiwen.com/subject/ymseuttx.html