【发布时间】:2015-02-20 06:48:55
【问题描述】:
我正在将视频流录制到磁盘。为此,我使用以下代码:
private async Task SaveToFile(IntPtr data, Int32 size)
{
if (_FileStream == null) return;
Byte[] buf = new Byte[size];
Marshal.Copy(data, buf, 0, size);
//dont await here - just continue
_FileStream.WriteAsync(buf, 0, size);
}
到目前为止,它似乎没有问题。我只想确认的是,如果在上一次迭代完成之前调用此方法会发生什么。
你会注意到我没有等待WriteAsync() 电话。我不确定这是否正确,但我正在使用的 API 状态以在此方法中将操作保持在最低限度,以免在 API 内部阻塞回调。这似乎是正确的做法,只需将数据传递给流,然后立即返回。
如果最后一次WriteAsync() 通话尚未结束,我再次拨打WriteAsync() 时,谁能确认会发生什么?还是应该awaitWriteAsync() 调用?
编辑: 我还没有使用上述方法遇到异常,所以我想我的最后一个问题是从外部 DLL 回调内部使用 WriteAsync() 时是否有任何影响? DLL 是第三方 Directshow 组件。我无法验证它在内部是如何工作的,但它只是通过回调为我提供数据,我在其中保存到文件流。
【问题讨论】:
-
如果你写一些简单的测试,你会看到多个
WriteAsync没有await如果同时运行,会导致异常。 -
我认为从外部 DLL 回调中调用它应该没问题,您还需要返回
Task表单_FileStream.WriteAsync(buf, 0, size);。也许这就是您没有看到异常的原因。 -
您确实需要在这里
await,正如编译器警告所暗示的那样。这并不意味着您不能并行使用多个WriteAsync,如果您真的需要的话。
标签: c# asynchronous async-await filestream