首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用IMAPI异步编写CD/DVD?

如何使用IMAPI异步编写CD/DVD?
EN

Stack Overflow用户
提问于 2019-03-21 04:55:24
回答 1查看 354关注 0票数 1

我被告知要编写一个软件,根据用户的选择同步/异步地刻录CD。我在项目中使用IMAPIv2和C#,它没有显式地提供异步写入数据的功能。

为了设计功能,我对网上资源进行了研究,但徒劳无功。

有人能解释什么是同步/异步I/O,在光盘上刻录映像吗?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-22 07:50:31

IMAPI不提供内置类/方法来异步写入数据。但它的设计方式是,任何支持异步编程的技术都是可能的。您正在使用的那个(正如您在注释中提到的C#)确实支持它。

IMAPI公开那些用于进度和操作的报表状态。您所需要做的就是使用线程异步运行该活动;这将释放您的UI,并且您可以执行其他活动。然后,您可以订阅将向您报告状态的事件。

请参阅CodeProject上的CodeProject项目,该项目相同地使用BackgroundWorker

多线程 刻录或格式化媒体可能需要一些时间,因此我们不希望在主UI线程上执行这些操作。我使用BackgroundWorker类来处理这些冗长任务的多线程处理。BackgroundWorker类允许您在线程中设置值,然后调用ReportProgress方法,该方法在调用线程中触发ProgressChanged事件。当您完成工作线程时,它会触发RunWorkerCompleted事件,通知调用线程它已经完成。

以下是DoWorkUpdate事件:

私有backgroundBurnWorker_DoWork(对象发送方,DoWorkEventArgs e) { MsftDiscRecorder2 discRecorder = null;MsftDiscFormat2Data discFormatData = null;尝试{/创建并初始化IDiscRecorder2对象// discRecorder =新MsftDiscRecorder2();var burnData = (BurnData)e.Argument;/创建和初始化IDiscFormat2Data // discFormatData =新的MsftDiscFormat2Data { Recorder = discRecorder,ClientName = ClientName,ForceMediaToBeClosed = _closeMedia };/设置验证级别// var burnVerification = (IBurnVerification)discFormatData;burnVerification.BurnVerificationLevel = _verificationLevel;/检查媒体是否为空,(对于RW媒体) // object[] multisessionInterfaces = null;if (!discFormatData.MediaHeuristicallyBlank) { multisessionInterfaces = discFormatData.MultisessionInterfaces;}/创建文件系统// IStream fileSystem;如果(!CreateMediaFileSystem(discRecorder,multisessionInterfaces,out fileSystem)) { e.Result = -1;返回;}/添加更新事件处理程序// discFormatData.Update += discFormatData_Update;/在这里写入数据//尝试{ discFormatData.Write(fileSystem);e.Result = 0;} catch (COMException ex) { e.Result = ex.ErrorCode;MessageBox.Show(ex.Message,"IDiscFormat2Data.Write failed",MessageBoxButtons.OK,MessageBoxIcon.Stop);}最后{ if (fileSystem != null) { Marshal.FinalReleaseComObject(fileSystem);}/删除更新事件处理程序// discFormatData.Update -= discFormatData_Update;if (_ejectMedia) { discRecorder.EjectMedia();} catch (COMException异常){/如果格式中发生任何事情,请显示消息// MessageBox.Show(exception.Message);e.Result = exception.ErrorCode;}最后{ If (discRecorder != null) { Marshal.ReleaseComObject(discRecorder);} if (discFormatData != null) { Marshal.ReleaseComObject(discFormatData);}} discFormatData_Update(In,MarshalAs(UnmanagedType.IDispatch)对象发送方,In,MarshalAs(UnmanagedType.IDispatch)对象进展){/检查是否取消// if (backgroundBurnWorker.CancellationPending) { var format2Data =(IDiscFormat2Data)发送方;format2Data.CancelWrite();返回;} var eventArgs =(IDiscFormat2DataEventArgs)进度;_burnData.task = BURN_MEDIA_TASK.BURN_MEDIA_TASK_WRITING;// IDiscFormat2DataEventArgs接口_burnData.elapsedTime = eventArgs.ElapsedTime;_burnData.remainingTime = eventArgs.RemainingTime;_burnData.totalTime = eventArgs.TotalTime;// IWriteEngine2EventArgs接口_burnData.currentAction = eventArgs.CurrentAction;_burnData.startLba = eventArgs.StartLba;_burnData.sectorCount = eventArgs.SectorCount;_burnData.lastReadLba =eventArgs.SectorCount;eventArgs.StartLba=;_burnData.totalSystemBuffer = eventArgs.TotalSystemBuffer;_burnData.usedSystemBuffer = eventArgs.UsedSystemBuffer;_burnData.freeSystemBuffer = eventArgs.FreeSystemBuffer;/返回UI // backgroundBurnWorker.ReportProgress(0,_burnData);}

代码语言:javascript
复制
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55274000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档