Приветствую.
Ни File.GetFileAttributes, ни сам WinAPI-метод из Kernell32.dll, как и многие его друзья, не предоставляют асинхронных версий, будь то async Task в .NET или Apc-очереди в WinAPI.
Однако, вызовы могут блокироваться. Особенно если речь идёт о получении данных по сети. В связи с этим вопрос — как правильно обернуть их в awaitable Task?
Может быть, я отстал от жизни и сейчас для всех методов по работе с файловой системой разработан асинхронный API?
Другой вопрос — если без блокирующих вызовов не обойтись — как их правильно отменять?
Есть функции CancelSynchronousIo и CancelIoEx, которые работают с нативными потоками? Но валидно ли их использовать для отмены задач в .NET?
Здравствуйте, LWhisper, Вы писали:
LW>Есть функции CancelSynchronousIo и CancelIoEx, которые работают с нативными потоками? Но валидно ли их использовать для отмены задач в .NET?
Их и не в .Net
с осторожностью применять надо.
In the synchronous case, a call to CancelSynchronousIo will attempt to cancel any current synchronous call on the thread. Without careful synchronization, the wrong call in a series of calls could get cancelled. These are very difficult to diagnose, since they are unpredictable and tend to occur rarely. A possible scenario is that CancelSynchronousIo is called. Although intended for a given synchronous operation, it only happens to start just after that operation completed (normally or with an error). If the thread that called the first operation then starts another synchronous call, the cancel call could interrupt this new I/O. This can have enormous consequences!
А в дотнете есть ещё и другая особенность: managed thread id не обязан соответствовать одному и тому же нативному потоку. На практике оно конечно соблюдается, но расставлять себе такие грабли на будущее я бы точно не стал.
Если задержки действительно являются критическими, то я бы использовал Task with timeout, аля
http://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-complete-with-timeout
http://blogs.msdn.com/b/pfxteam/archive/2011/11/10/10235834.aspx
Здравствуйте, Sinix, Вы писали:
S>Если задержки действительно являются критическими, то я бы использовал Task with timeout, аля
S>http://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-complete-with-timeout
S>http://blogs.msdn.com/b/pfxteam/archive/2011/11/10/10235834.aspx
Спасибо! Да, я видел информацию по этому чудесному методу, поэтому и поинтересовался — можно ли им пользоваться без риска застрелиться.
Ну, в параллельном треде мы как раз обсуждали проблемы, возникающие при использовании блокирующих вызовов в высоконагруженных серверных системах, поэтому да — задержки критичны.