如何在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:我是一个新手在委托和异步方法调用
异步编程模式
.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();
在你的方法中,你可以执行发送,然后添加一些委托。