[WinAPI] Асинхронный вызов WinAPI.IO процедур из .NET
От: LWhisper  
Дата: 26.08.16 12:54
Оценка: 6 (1)
Приветствую.

Ни File.GetFileAttributes, ни сам WinAPI-метод из Kernell32.dll, как и многие его друзья, не предоставляют асинхронных версий, будь то async Task в .NET или Apc-очереди в WinAPI.
Однако, вызовы могут блокироваться. Особенно если речь идёт о получении данных по сети. В связи с этим вопрос — как правильно обернуть их в awaitable Task?
Может быть, я отстал от жизни и сейчас для всех методов по работе с файловой системой разработан асинхронный API?

Другой вопрос — если без блокирующих вызовов не обойтись — как их правильно отменять?
Есть функции CancelSynchronousIo и CancelIoEx, которые работают с нативными потоками? Но валидно ли их использовать для отмены задач в .NET?
winapi async await task .net io file
Re: [WinAPI] Асинхронный вызов WinAPI.IO процедур из .NET
От: Sinix  
Дата: 26.08.16 13:24
Оценка: 4 (1) +2
Здравствуйте, 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
Re[2]: [WinAPI] Асинхронный вызов WinAPI.IO процедур из .NET
От: LWhisper  
Дата: 26.08.16 14:22
Оценка:
Здравствуйте, 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
Спасибо! Да, я видел информацию по этому чудесному методу, поэтому и поинтересовался — можно ли им пользоваться без риска застрелиться.
Ну, в параллельном треде мы как раз обсуждали проблемы, возникающие при использовании блокирующих вызовов в высоконагруженных серверных системах, поэтому да — задержки критичны.
Re[3]: [WinAPI] Асинхронный вызов WinAPI.IO процедур из .NET
От: VladCore  
Дата: 26.08.16 18:31
Оценка:
Здравствуйте, LWhisper, Вы писали:


LW>Ну, в параллельном треде мы как раз обсуждали проблемы, возникающие при использовании блокирующих вызовов в высоконагруженных серверных системах, поэтому да — задержки критичны.


Я не понял поинт про высоконагруженные системы.

В высоконагруженных системах задержки могут быть и 1 миллисек и 30 секунд, если говорить про чтение атрибута файла.

Никогда не вешайте таймаут на файловые операции. (с) йода.

На сетевые операции таймаут нужен на небольшие объёмы данных и лимит скорости закачки больших блобов.

Про таймаут на файловые операции кто нибудь слышал/видел?
Отредактировано 26.08.2016 18:46 VladCore . Предыдущая версия . Еще …
Отредактировано 26.08.2016 18:33 VladCore . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.