为什么[C]在当前市场中的需求如此旺盛?

2026-04-29 04:561阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1088个文字,预计阅读时间需要5分钟。

为什么[C]在当前市场中的需求如此旺盛?

[原创]以下是伪原创开头内容,已对原文进行改写,避免抄袭嫌疑,字数不超过100字。

[C#] 将同步方法改写为异步方法


前言

当我们遇到所需要花费较长时间的程序时,

我们通常会透过异步的方式来调用它 (比如读取数据流的BeginRead, EndRead),

那如果本来是同步的方法,我们有没有办法可以改写它呢?

这篇的主题就是要来介绍如何将同步(sync)的程序改写为异步(async)的程序。

实际演练

在.Net Framework中,异步模型(APM)大致上可以区分为两类,

基于IAsyncResult的异步模型,以及Event Based的异步模型,

我们先来建立一个很简单的加法函数,并且为它加入Thread.Sleep来模拟花费大量的时间,

public class Calculator { public int Calculate(int a, int b) { // 模拟花费大量时间运算 System.Threading.Thread.Sleep(10 * 1000); return a + b; } }

通常在程序中执行此函数时看起来会像这样,程序会卡在这边非常久

Calculator calculator = new Calculator(); // 程序会停在这边很长的时间 int result = calculator.Calculate(1, 2);

接下来,将介绍如何将这支函数改写为可用异步的方式调用

1. 改写为基于IAsyncResult的异步模型

首先,我们必须要先建立一个与函数Input和Output相同的delegate,

因为在3.5之后的版本已经有内建Func,所以在今天的范例就直接使用Func来当作delegate,

//In 2.0, sample, not work //private delegate int CalculateDelegate(int a,int b); //CalculateDelegate m_calculateDelegate = new CalculateDelegate(Calculate); private Func m_calculateDelegate;

之后我们可以仿照数据流读取的BeginRead和EndRead一样,分别撰写BeginCalculate和EndCalculate方法,

public IAsyncResult BeginCalculate(int a, int b) { this.m_calculateDelegate = this.Calculate; return this.m_calculateDelegate.BeginInvoke(a, b, null, null); } public int EndCalculate(IAsyncResult asyncResult) { return this.m_calculateDelegate.EndInvoke(asyncResult); }

如此一来,我们就可以在程序中使用异步的方法调用BeginCalculate和EndCalculate,

并且可以在程序计算完毕之前,继续做其他的事情,

Calculator calculator = new Calculator(); IAsyncResult asyncResult = calculator.BeginCalculate(1, 2); // Do something else int result = calculator.EndCalculate(asyncResult);

?2. 改写为Event Based的异步模型?

Event Based的异步模型,在执行完毕之后会将主控权交还给程序,

不会阻塞目前的Thread,一直到执行完毕之后,才会触发注册的事件。

首先我们建立一个当执行完毕时会触发的事件,并且会传入具有计算结果的EventArgs

public event EventHandler CalculateFinished; public class CalculateFinishedEventArgs : EventArgs { public int Result { get; private set; } public CalculateFinishedEventArgs(int result) { this.Result = result; } }

再来我们建立一个供程序调用的方法CalculateAsync,在执行之后并不会阻塞Thread,

并且会在执行完毕之后,触发CalculateFinished事件,

public void CalculateAsync(int a, int b) { this.m_calculateDelegate = Calculate; AsyncCallback callback = new AsyncCallback(OnCalculateFinished); this.m_calculateDelegate.BeginInvoke(a, b, callback, m_calculateDelegate); } private void OnCalculateFinished(IAsyncResult asyncResult) { Func calculateDelegate = (Func)asyncResult.AsyncState; int result = calculateDelegate.EndInvoke(asyncResult); EventHandler temp = CalculateFinished; if (temp != null) { temp(this, new CalculateFinishedEventArgs(result)); } } ,>,>

执行程序就可改写如下

Calculator calculator = new Calculator(); calculator.CalculateFinished += (o, args) => MessageBox.Show(string.Format("Result is {0}", args.Result)); calculator.CalculateAsync(1, 2); // Do other works...

结语

为了有效的利用系统资源,并行作业,以及提供使用者良好的使用者体验,

在撰写程序时使用异步的方法调用是不可或缺的,

但在撰写异步程序的同时,却往往会造成程序较为零碎,

而比较不容易阅读和维护的困扰,在下次的文章之中,

会来介绍如何使用Iterator来改善这种情况,

当然也可以利用之前介绍的异步调用方法并跳出处理中窗口,

透过BackgroundWorker或是Thread的方式来处理,

也欢迎大家一起多多讨论和指教啰 ^_^

参考数据:

为什么[C]在当前市场中的需求如此旺盛?

1. msdn.microsoft.com/zh-tw/library/2e08f6yc(v=VS.100).aspx 以异步的方式调用同步方法

2. msdn.microsoft.com/zh-tw/magazine/cc163467.aspx 实践 CLR 异步程序撰写模型

原文:大专栏 [C#] 将同步方法改写为异步方法

本文共计1088个文字,预计阅读时间需要5分钟。

为什么[C]在当前市场中的需求如此旺盛?

[原创]以下是伪原创开头内容,已对原文进行改写,避免抄袭嫌疑,字数不超过100字。

[C#] 将同步方法改写为异步方法


前言

当我们遇到所需要花费较长时间的程序时,

我们通常会透过异步的方式来调用它 (比如读取数据流的BeginRead, EndRead),

那如果本来是同步的方法,我们有没有办法可以改写它呢?

这篇的主题就是要来介绍如何将同步(sync)的程序改写为异步(async)的程序。

实际演练

在.Net Framework中,异步模型(APM)大致上可以区分为两类,

基于IAsyncResult的异步模型,以及Event Based的异步模型,

我们先来建立一个很简单的加法函数,并且为它加入Thread.Sleep来模拟花费大量的时间,

public class Calculator { public int Calculate(int a, int b) { // 模拟花费大量时间运算 System.Threading.Thread.Sleep(10 * 1000); return a + b; } }

通常在程序中执行此函数时看起来会像这样,程序会卡在这边非常久

Calculator calculator = new Calculator(); // 程序会停在这边很长的时间 int result = calculator.Calculate(1, 2);

接下来,将介绍如何将这支函数改写为可用异步的方式调用

1. 改写为基于IAsyncResult的异步模型

首先,我们必须要先建立一个与函数Input和Output相同的delegate,

因为在3.5之后的版本已经有内建Func,所以在今天的范例就直接使用Func来当作delegate,

//In 2.0, sample, not work //private delegate int CalculateDelegate(int a,int b); //CalculateDelegate m_calculateDelegate = new CalculateDelegate(Calculate); private Func m_calculateDelegate;

之后我们可以仿照数据流读取的BeginRead和EndRead一样,分别撰写BeginCalculate和EndCalculate方法,

public IAsyncResult BeginCalculate(int a, int b) { this.m_calculateDelegate = this.Calculate; return this.m_calculateDelegate.BeginInvoke(a, b, null, null); } public int EndCalculate(IAsyncResult asyncResult) { return this.m_calculateDelegate.EndInvoke(asyncResult); }

如此一来,我们就可以在程序中使用异步的方法调用BeginCalculate和EndCalculate,

并且可以在程序计算完毕之前,继续做其他的事情,

Calculator calculator = new Calculator(); IAsyncResult asyncResult = calculator.BeginCalculate(1, 2); // Do something else int result = calculator.EndCalculate(asyncResult);

?2. 改写为Event Based的异步模型?

Event Based的异步模型,在执行完毕之后会将主控权交还给程序,

不会阻塞目前的Thread,一直到执行完毕之后,才会触发注册的事件。

首先我们建立一个当执行完毕时会触发的事件,并且会传入具有计算结果的EventArgs

public event EventHandler CalculateFinished; public class CalculateFinishedEventArgs : EventArgs { public int Result { get; private set; } public CalculateFinishedEventArgs(int result) { this.Result = result; } }

再来我们建立一个供程序调用的方法CalculateAsync,在执行之后并不会阻塞Thread,

并且会在执行完毕之后,触发CalculateFinished事件,

public void CalculateAsync(int a, int b) { this.m_calculateDelegate = Calculate; AsyncCallback callback = new AsyncCallback(OnCalculateFinished); this.m_calculateDelegate.BeginInvoke(a, b, callback, m_calculateDelegate); } private void OnCalculateFinished(IAsyncResult asyncResult) { Func calculateDelegate = (Func)asyncResult.AsyncState; int result = calculateDelegate.EndInvoke(asyncResult); EventHandler temp = CalculateFinished; if (temp != null) { temp(this, new CalculateFinishedEventArgs(result)); } } ,>,>

执行程序就可改写如下

Calculator calculator = new Calculator(); calculator.CalculateFinished += (o, args) => MessageBox.Show(string.Format("Result is {0}", args.Result)); calculator.CalculateAsync(1, 2); // Do other works...

结语

为了有效的利用系统资源,并行作业,以及提供使用者良好的使用者体验,

在撰写程序时使用异步的方法调用是不可或缺的,

但在撰写异步程序的同时,却往往会造成程序较为零碎,

而比较不容易阅读和维护的困扰,在下次的文章之中,

会来介绍如何使用Iterator来改善这种情况,

当然也可以利用之前介绍的异步调用方法并跳出处理中窗口,

透过BackgroundWorker或是Thread的方式来处理,

也欢迎大家一起多多讨论和指教啰 ^_^

参考数据:

为什么[C]在当前市场中的需求如此旺盛?

1. msdn.microsoft.com/zh-tw/library/2e08f6yc(v=VS.100).aspx 以异步的方式调用同步方法

2. msdn.microsoft.com/zh-tw/magazine/cc163467.aspx 实践 CLR 异步程序撰写模型

原文:大专栏 [C#] 将同步方法改写为异步方法