首页 / C# / c# – 在F#中处理资源清理的功能方式
c# – 在F#中处理资源清理的功能方式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在F#中处理资源清理的功能方式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2617字,纯文字阅读大概需要4分钟。
内容图文
![c# – 在F#中处理资源清理的功能方式](/upload/InfoBanner/zyjiaocheng/819/2bd9e5882ca74b2e9e0fada06d4eb17a.jpg)
嗨,这是C#语言如何处理Com互操作资源管理的例子. orginal source:
Excel.Application app = null;
Excel.Workbooks books = null;
Excel.Workbook book = null;
Excel.Sheets sheets = null;
Excel.Worksheet sheet = null;
Excel.Range range = null;
try
{
app = new Excel.Application();
books = app.Workbooks;
book = books.Add();
sheets = book.Sheets;
sheet = sheets.Add();
range = sheet.Range["A1"];
range.Value = "Lorem Ipsum";
book.SaveAs(@"C:\Temp\ExcelBook" + DateTime.Now.Millisecond + ".xlsx");
book.Close();
app.Quit();
}
finally
{
if (range != null) Marshal.ReleaseComObject(range);
if (sheet != null) Marshal.ReleaseComObject(sheet);
if (sheets != null) Marshal.ReleaseComObject(sheets);
if (book != null) Marshal.ReleaseComObject(book);
if (books != null) Marshal.ReleaseComObject(books);
if (app != null) Marshal.ReleaseComObject(app);
}
我个人认为上面的代码是合理和必要的.但它不是功能性或F#方式.我最后在不同级别的嵌套try中定义了所有这些com变量.最后并尝试… with并且因为必须在try块之前定义变量,所以在finally和with块中都存在清理代码.这非常凌乱.
我怎样才能在F#中正确实现相同的功能?有点讽刺的是,互联网上有很多例子说明如何使用F#和interop作为展示F#功能的方式.但是,没有人讨论如何管理com资源清理.
关于良好模式的任何建议都是适用的.
解决方法:
您可以创建一个计算表达式来调用try / catch中的每个步骤,并在完成时释放.我们可以使用插件函数为create / finalize创建一个构建器,以便我们可以看到正在发生的事情.
type FinalizationBuilder(oncreate, onfinal) =
member __.Bind(m, f) =
oncreate(box m)
try
try
f m
with ex ->
Choice2Of2 ex.Message
finally
onfinal(box m)
member __.Return(m) = Choice1Of2 m
member __.Zero() = Choice1Of2()
然后,您需要一个COM工作流,它只是在COM组件完成时释放它.
let com = new FinalizationBuilder(ignore, System.Runtime.InteropServices.Marshal.ReleaseComObject >> ignore)
你这样使用它:
[<EntryPoint>]
let main _ =
com {
let! app = new Excel.Application()
let! books = app.Workbooks
let! book = books.Add()
// ...
app.Quit()
} |> ignore
0
我没有安装excel,但我可以使用例外和printfns来模拟它.
let demo = new FinalizationBuilder(printfn "Created %A", printfn "Released %A")
[<EntryPoint>]
let main _ =
demo {
let! x = 1
let! y = 2
let! z = 3
return x + y + z
} |> printfn "Result: %A"
0
// Created 1
// Created 2
// Created 3
// Released 3
// Released 2
// Released 1
// Result: Choice1Of2 6
或者例外:
[<EntryPoint>]
let main _ =
demo {
let! x = 1
let! y = 2
let! z = failwith "boom"
return x + y + z
} |> printfn "Result: %A"
0
// Created 1
// Created 2
// Released 2
// Released 1
// Result: Choice2Of2 "boom"
总而言之,看起来无论如何都不需要这样做.一个简单的GC.Collect(); GC.WaitForPendingFinalizers()可以解决这个问题而不需要任何这个:https://stackoverflow.com/a/25135685/171121
内容总结
以上是互联网集市为您收集整理的c# – 在F#中处理资源清理的功能方式全部内容,希望文章能够帮你解决c# – 在F#中处理资源清理的功能方式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。