如何在c#类库中编写异步方法

本文关键字:异步方法 类库 | 更新日期: 2023-09-27 18:10:04

我正在尝试用c#编写一个类库。我应该使用。net framework 3.0。

我有一个将一种文件类型转换为另一种文件类型的方法。这需要时间:

public bool ConvertFiles()
{
    // Conversion takes a long time
    // After conversion, if conversion is successfull then I return true, 
    // else I return false
}

由于这个方法将被给予public,当API用户想要使用这个函数时,我不应该因为这个方法而阻止他的应用程序。例句:

//User calls my API functions
ApiClass api = new ApiClass;
api.ConvertFiles();
// user should not wait for ConvertFiles to finish
// user's codes should continue even if ConvertFiles is not finished!

因此,我理解它,我应该给API用户一个"异步方法"。

直到现在我搜索了以下链接:

  • http://www.codeproject.com/Articles/14931/Asynchronous-Method-Invocation
  • https://support.microsoft.com/en-us/kb/315582
  • http://www.codeproject.com/Articles/41777/NET-Framework-Delegates-Understanding-Asynchronou

在阅读了它们之后,我明白了我可以创建一个这样的方法:

public bool ConvertFilesAsync()
{
    MethodDelegate dlgt = ConvertFiles;
    // Create the callback delegate.
    AsyncCallback cb = MyAsyncCallback;
   // Initiate the Asynchronous call passing in the callback delegate
   // and the delegate object used to initiate the call.
   IAsyncResult ar = dlgt.BeginInvoke();
}
private void MyAsyncCallback(IAsyncResult ar)
{
// Because you passed your original delegate in the asyncState parameter
// of the Begin call, you can get it back here to complete the call.
MethodDelegate dlgt = (MethodDelegate) ar.AsyncState;
// Complete the call.
bool conversion = dlgt.EndInvoke (ar) ;
}

当用户导入我的类库时,他将使用如下函数:

//User calls my API functions
ApiClass api = new ApiClass;
api.ConvertFilesAsync();
// Now user's codes continue even if ConvertFiles is not finished!

但是他如何理解转换是否成功完成?在他的代码的某个地方,他应该明白文件转换已经完成?我该如何处理呢?

Ps:我是一个新手在委托和异步方法调用

如何在c#类库中编写异步方法

异步编程模式

.NET框架提供了三种执行异步的模式操作:

异步编程模型(APM)模式(也称为IAsyncResult模式),其中异步操作需要Begin和结束方法(例如异步的BeginWrite和EndWrite)写操作)。此模式不再推荐用于新版本发展。有关更多信息,请参见异步编程模型(APM)。

基于事件的异步模式(EAP),它需要具有Async后缀的方法,并且还需要一个或多个事件event处理程序委托类型和eventarg派生类型。引入EAP在。net Framework 2.0中。它不再被推荐用于新的发展。有关详细信息,请参见基于事件的异步模式(EAP)。

基于任务的异步模式(TAP),它使用单个方法来表示异步的启动和完成操作。TAP是在。net Framework 4中引入的.NET中推荐的异步编程方法框架。c#中的async和await关键字以及async和awaitVisual Basic语言中的操作符增加了对TAP的语言支持。为更多信息,请参见基于任务的异步模式(TAP)。

因为你使用的是。net 3,所以你可以使用APM和EAP。

你可以在这里找到一个例子:MSDN如何:实现一个支持基于事件的异步模式的组件。Net 3.0)

也许你可以用BackgroundWorker class

您可以创建私有字段,如:

private BackgroundWorker backgroundWorker;

然后在构造函数中创建一个实例并开始运行:

this.backgroundWorker = new BackgroundWorker();
this.backgroundWorker.WorkerSupportsCancellation = true;
this.backgroundWorkerr.DoWork += new DoWorkEventHandler(YourMethod);
this.backgroundWorker.RunWorkerAsync();

在你的方法中,你可以执行发送,然后添加一些委托。