.net - 从 SemaphoreSlim 中关闭计算机是否会带来麻烦?
问题描述
我正在尝试创建以下逻辑:
- 做一个
IO
动作并收到一个结果 - 如果结果(字符串)
"shutdown"
则关闭计算机 - 否则设置一个共享变量(变量需要是线程安全的)
我的问题:从内部关闭计算机有什么问题SemaphoreSlim
吗?
我可以进行检查并在锁中设置共享变量,然后再次执行检查(在锁外)并关闭电脑,但我不想重复相同的情况。
int someSharedVariable;
await @lock.WaitAsync();
try {
await someService.SendMessageAsync("query");
var received = await userService.ReceiveMessageAsync<string>();
if(received=="shutdown") {
//SHUTDOWN computer
}
else {
someSharedVariable=3;
}
} finally {
@lock.Release();
}
解决方案
从 SemaphoreSlim 中关闭计算机有什么问题吗?
我的服务使用了一些 IO 句柄,我认为在关闭它们时,如果处理不当,它们可能会损坏磁盘上的数据或其他东西。
关闭计算机将结束所有进程。结束进程将关闭该进程持有的所有句柄。因此,仅打开句柄这一事实不会引起任何问题;操作系统通过关闭它们来清理所有进程句柄。
但是,如果您的应用程序在关机期间可能正在写入文件,那么就需要担心了。操作系统将优雅地关闭 - 请求每个进程退出,然后等待一段时间让它们进行清理。但是,如果您的应用程序知道它将关闭,您可能需要在开始关闭之前进行清理。这样,您的应用程序就不可能在关机开始时决定它需要写出大量数据,并且没有时间完成。
SemaphoreSlim
因此,要回答您的具体问题,不,在持有(或任何其他锁)的同时关闭计算机没有任何问题。
推荐阅读
- javascript - How do I change gauge size with jQuery?
- azure-devops - Migrate TFS 2018 Update 3 to Azure DevOps Services
- django-models - django.db.utils.IntegrityError(无法创建唯一索引)
- android - Pass object or objects id to new activity
- mysql - How to remove quotes from req.params.id when sending query
- python - How can I fix an AttributeError while loading checkpoint?
- c# - How to check the value passed into the dictionary
- node.js - How to manipulate a xml file and save it to disk?
- c# - Image isn't displaying
- firebase - Firestore rules do not permit claims for signInWithCustomToken user using custom JWT