`

DotNet中异步编程的简单应用

阅读更多

这里说的异步编程并不是AJAX等的Web异步编程,而仅仅是DotNet中多线程的异步编程.这种多线程的异步编程主要用来解决某些受计算操作影响而引起主线程阻塞的问题.让程序(主要是窗体应用程序)看跑得更流畅.在dotnet的CLR以及API方法中有简单易用的方法供我们实现异步编程,并且都有相似的调用方法,诸如BeginXXX,EndXXX,IAsyncResult对象,同时也都涉及到回调,委托等操作.下面是一些简单的应用

1.异步IO操作,基本上就是按参数传递

// 值得注意的是最好给定FileOptions.Asynchronous,相对效率会高些
FileStream fs = new FileStream("E:\\test.txt", FileMode.Open, FileAccess.Read, FileShare.Read, 1024, FileOptions.Asynchronous);
byte[] data = new byte[(int) fs.Length];

// 开始读取
fs.BeginRead(data, 0, data.Length, delegate(IAsyncResult ar)
{
    // 这里是读取结束之后回调的委托方法内容
    fs.EndRead(ar);
    fs.Close();

    string content = Encoding.Default.GetString(data);
    Console.WriteLine(content);
}, fs);

 

2.读取数据库内容的异步操作,这里的代码是用在窗体程序中,涉及到一个跨线程改变窗体控件的问题,但是在窗体里,只有通过窗体的主线程来改变控件的行为.如下异步读取数据,读取数据的操作是在另外一个线程中,因此试图在这个线程中操作窗体控件是徒劳的,还会出异常.所以只能通过窗体的invoke方法,调用一个委托,这样才能实现.当然这里只是为了提出这个问题,其他的解决的方法还是有的,比如效率更低的轮询方法.

// 这个委托 用于在窗体的主线程中调用
private delegate void FillGridHandler(SqlDataReader reader);
private void AsnDataAccess()
{
    // 对于异步操作的数据访问,连接字符串里必须设置Async=True
    string conStr = ConfigurationManager.ConnectionStrings["NorthWind"].ConnectionString;
    SqlConnection con = new SqlConnection(conStr);
    SqlCommand command = new SqlCommand("select [CompanyName] from [Suppliers]", con);

    con.Open();
    command.BeginExecuteReader(delegate(IAsyncResult ar)
    {
        SqlDataReader reader = command.EndExecuteReader(ar);

        // 对于窗体应用程序的 GridView的绑定
        FillGridHandler fillGridHandler = delegate(SqlDataReader reader1)
        {
            DataTable dt = new DataTable();
            dt.Load(reader1);
            reader.Close();
            dataGridView1.DataSource = dt;
        };

        // 用窗体自身的线程去触发委托方法 才能改变窗体里控件属性
        this.Invoke(fillGridHandler, reader);                
    }, command, System.Data.CommandBehavior.CloseConnection);
}

 

3.异步触发委托的方法,异步编程离不开委托,其本身也就是调用了委托的异步方法,其内部就必定有一个委托对象

delegate int CalSumHandler(int number);
private static void DelegateAsyn()
{
    CalSumHandler handler = delegate(int number)
    {
        int sum = 0;
        for (int i = 0; i < number; i++)
        {
            sum += i;
        }
        return sum;
    };

    int n = 10;
    handler.BeginInvoke(n, delegate(IAsyncResult ar)
    {
        int res = handler.EndInvoke(ar);
        Console.WriteLine("result from asyndelegate,sum = {0}", res);
    }, n);
}

 

分享到:
评论

相关推荐

    DotNET高级应用书

    .NET Remoting 主要应用于需要跨越多个计算机系统执行代码的企业级应用中。 - **分布式应用程序特点**: - 高效性:能够充分利用网络资源,提高计算效率。 - 可扩展性:易于添加新的服务节点来增强系统的处理...

    C#dotNet4并行编程(英文版).zip

    遵循一些最佳实践,如避免共享状态、使用局部变量减少竞态条件,以及使用 `async/await` 关键字来简化异步编程,可以帮助编写更稳定、高效的并行代码。 这个“C# .NET 4 并行编程(英文版)”的资料涵盖了以上这些...

    dotnet 从入门到放弃的 500 篇博客合集

    随着技能的提升,你可以深入学习泛型、委托、事件、异步编程、LINQ(Language Integrated Query)等高级特性,这些是构建复杂应用程序的关键。 接下来是WPF,它是.NET Framework的一部分,用于构建具有丰富图形界面...

    C#编写的DOTNET应用论坛0904版~星海下载

    C#语言的特性,如面向对象编程、泛型、匿名方法、Lambda表达式、异步编程等,在这个论坛应用中起到了关键作用。例如,面向对象编程使得我们可以设计出可维护和可扩展的代码结构;泛型提供了类型安全的数据容器,减少...

    dotnet-一个简单的slackbot库用于监听和响应消息

    这通常涉及到异步编程,以确保高并发环境下的性能。 3. **消息解析**:库需要解析接收到的Slack消息,包括用户、频道、消息内容等信息,以便正确地回应。 4. **响应生成**:根据消息内容,bot可能需要生成适当的...

    精通dotnet核心技术高级特性

    在处理I/O密集型任务或网络请求时,异步编程至关重要。DotNet中的async/await关键字使得编写异步代码变得直观易懂。通过异步操作,程序可以避免阻塞主线程,提高用户体验。 4. **委托与事件(Delegates and Events...

    dotnet-RestSharp是NET简单REST和HTTPAPI客户端

    5. **异步操作**:为了适应非阻塞的编程模型,RestSharp提供了异步版本的API,可以使用async/await关键字来编写非阻塞代码,提高应用程序的性能。 6. **扩展性**: RestSharp设计为可扩展,允许开发者自定义编码器...

    dotnet-将Redux状态存储与Blazer连接

    标题 "dotnet-将Redux状态存储与Blazer连接" 暗示了本文将探讨如何在.NET开发的Blazor应用中集成Redux状态管理库。Blazor是Microsoft推出的一个用于构建Web应用程序的开源框架,它允许开发者使用C#和Razor语法进行...

    dotnet 简单方法在一个进程内同时跑起 WPF 和 ASP.NET Core 框架.rar

    5. **异步编程**:考虑到WPF界面的响应性,WPF应用中的所有网络通信应使用异步方法,避免阻塞UI线程。同样,ASP.NET Core的API也应设计为异步,以便更好地处理并发请求。 6. **错误处理**:同时运行两个框架会增加...

    cs9dotnet5一些简单示例比较容易看懂.zip

    在这个压缩包"cs9dotnet5一些简单示例容易看懂.zip"中,我们可以找到一系列用 C# 编写的 .NET 5 示例代码,帮助我们更好地理解和掌握 .NET 5 的新特性。 1. **泛型元组** 在 .NET 5 中,C# 引入了对泛型元组的支持...

    dotnet-NSmartProxy是一款免费的内网穿透工具采用NETCORE的全异步模式打造

    全异步模式利用了.NET CORE的异步编程模型,如async/await关键字,确保程序在等待I/O操作完成时不会阻塞线程,从而提高系统资源利用率。 描述中提到,NSmartProxy是“免费”的,这意味着开发者和用户可以免费使用这...

    dotnet-WorkflowCore是一款针对NET标准的轻量级工作流引擎

    3. **异步执行**:WorkflowCore利用.NET的异步编程模型,确保工作流执行时不会阻塞主线程,提高了系统的响应性和并发性能。 4. **可视化设计**:虽然WorkflowCore本身并不包含图形化设计工具,但其开放的API允许...

    dotnet-Refit是Xamarin和NET的自动类型安全的REST库

    4. **异步编程**:Refit完全支持C#的async/await语法,使得异步网络调用更加直观和高效,不会阻塞主线程,提高应用性能。 5. **错误处理**:Refit内置了对HTTP状态码的处理,可以根据返回的状态码进行相应的错误...

    C#实用类集-DotNet.Utilities

    《C#实用类集-DotNet.Utilities》是一个针对C#编程语言开发的高效、便捷的工具类库,它集合了各种常见的编程需求,为开发者提供了丰富的功能,旨在提高开发效率和代码质量。这个类库主要包含以下几个核心领域的知识...

    rabbitmq-dotnet-client-3.5.0

    总结,RabbitMQ Dotnet客户端3.5.0为.NET开发者提供了全面的API,使得在.NET环境中集成RabbitMQ变得简单而高效。正确理解和熟练使用这些功能,可以帮助构建出更健壮、可扩展的分布式系统。在实际项目中,应结合业务...

    selenium-dotnet 2.4

    Selenium-dotnet 是一个用于Web应用程序自动化测试的框架,特别适合进行功能测试和回归测试。它允许开发人员使用C#编程语言来控制浏览器,模拟真实用户的行为。在这个版本中,我们关注的是2.26.0和2.44.0这两个版本...

    dotnet开发技巧

    Task和async/await关键字使得异步编程更为简单,但理解并发的基本概念和线程同步机制也非常重要。 11. **代码重构**:定期进行代码重构,可以保持代码结构清晰,提高可读性和可维护性。学会使用重构工具,如...

    DotNet文本资料

    10. **并发和多线程**:理解并发的概念,以及如何在C#中使用线程和异步编程。 11. **设计模式**:介绍一些常见的软件设计模式,并在C#中应用。 12. **NuGet包管理**:如何使用NuGet来添加、管理和更新第三方库。 ...

    DotNet4.0- C#基类库大全苏飞版

    2. **异步编程**:引入了`async`和`await`关键字,简化了异步编程模型,使得开发者可以编写出易于理解和维护的异步代码,而无需过多关注底层的线程管理和回调函数。 3. **动态类型**:新增了`dynamic`关键字,允许...

    dotnet-SuperSocket是一个轻量级跨平台和可扩展socket服务器应用程序框架

    在IT行业中,网络通信是不可或缺的一部分,而Socket编程则是实现这一目标的关键技术。本文将深入探讨一个名为"SuperSocket"的框架,它是一个专为.NET开发者设计的轻量级、跨平台且高度可扩展的Socket服务器应用程序...

Global site tag (gtag.js) - Google Analytics