Ошибка Диспетчера задач Windows – прямой путь к переустановке системы. Причины возникновения ошибок

Если вы столкнулись с ошибкой «не найдена точка входа в процедуру в библиотеке dll kernel32.dll» И ищите решение, я расскажу что это такое, и как с этим бороться. Сообщения связанные с библиотекой kernel32.dll могут быть разными. Любая программа может выдать ошибку связанные с этой библиотекой. Я недавно писал статью о проблеме с dll, как , но там файл именно отсутствовал. В нашем случае проблема немного иная.

Вот небольшой список сообщений выдаваемых системой по поводу kernel32, возможно одна из них соответствует вашему:

  • точка входа в процедуру getlogicalprocessorinformation kernel32.dll
  • точка входа в процедуру не найдена в библиотеке dll kernel32.dll
  • Не найдена библиотека kernel32 dll
  • Программа вызвала ошибку в модуле kernel32.dll
  • getfileinformationbyhandleex не найдена в библиотеке kernel32.dll
  • setdefaultdlldirectories не найдена в библиотеке dll kernel32
  • Failed to get proc address for GetlogicalProcessorInformation kernel32.dll
  • releasesrwlockexclusive не найдена kernel32 dll

Ошибка Kernel32.dll может возникнуть практически в любое время, когда Windows запускается, при открытии или закрытии программы, на памяти есть пара эпизодов, когда просто при перетаскивании окна программы. Ошибки kernel32.dll встречаются не только в Windows XP, но и в Windows 7, а иногда и в Windows 8.

Как говорят ИТшники, от сбоев никто не застрахован. Так давайте разберемся, что это за ошибка и как ее исправить своими силами.

Причины ошибки kernel32.dll

Причины ошибки такие же разные, как и сами сообщения о ней, и может возникать в абсолютное любое время. Сам же файл библиотеки kernel32.dll отвечает за функции ввода-вывода, а также прерывания в работе с оперативною памятью Windows. При запуске Windows, kernel32.dll загружается в защищенное пространство памяти, таким образом, другие программы не пытаются пользоваться тем же пространством в памяти, чтобы выполнить свои операции.

Но когда одна или несколько программ пытаются получить доступ к этому защищенному пространству в памяти ПК, собственно и возникает сбой.

Чаще всего ошибку вызывает одна конкретная программа, не исключены случаи, когда проблема появляется при запуске нескольких приложений. Вследствие малого объема оперативной памяти так же есть вероятность ошибки.

Операционка обычно указывает причину отказа, в виде информации на что обратить внимание, чаще всего это конкретный файл, на который и стоит обратить внимание. Бывают случаи, когда информации мало, как в случае при установке skype.

Исправляем ошибку Kernel32.dll

Решение ошибки есть, и мы с Вами рассмотрим их по порядку. От простых до более сложных, если поможет легкий вариант, зачем углубляться дальше, правильно?! Постараемся исправить ошибку не прибегая к кардинальным методам, таким как переустановка виндовс. Хотя и такой метод иногда бывает полезен, когда ОС работает более 3-5 лет без переустановки и обслуживания.

ПРИМЕЧАНИЕ: Не пытайтесь искать в интернете о том, где и как скачать KERNEL32.dll, так как это ни к чему хорошему не приведет. Можете скачать не подходящий файл или под видом нужной библиотеки скачать вирус! Имейте ввиду, возникновение ошибки не означает отсутствие файла.

Совет: Если Вы являетесь пользователем Windows XP SP1 или SP2, то Вам целесообразно будет начать со скачивания и обновления вашей ОС до SP3. Т.к. большинство программ отказываются работать на устаревших ОС. Или задумайтесь о переходе на Windows 10, более или менее стабильная операционная система.

Ошибка setdefaultdlldirectories (решение для Windows 7)

Вынес отдельным пунктом данное решение, и поднял в самое начало, т.к. скорее всего следует начать именно с этого. Если у Вас Windows 7, не важно какой разрядности, и вы столкнулись с ошибкой «setdefaultdlldirectories не найдена в библиотеке dll kernel32», то установите данное обновление на Вашу ОС.

Отдельно хочу заметить пользователей софта от Sony PC Companion это обновление будет не как кстати, так как очень часто оно выдает такую ошибку.

Для тех у кого проблемы с загрузкой внешних библиотек, и текст ошибки звучит именно так:

  • SetDefaultDllDirectories
  • AddDllDirectory
  • RemoveDllDirectory

Корпорация Майкрософт выпустила улучшения API для Windows, которые позволят правильно и безопасно загружать внешние библиотеки. Для этого необходимо скачать с официального сайта Майкрософт обновления для своей ОС:

Варианты решения ошибки Kernel32.dll

Единичный системный сбой. По счастливой случайности ошибка kernel32.dll может быть единичным случаем, можно выполнить перезагрузку компьютера . После перезапуска windows возможно проблема уйдет сама собой.

Переустановить программу, с которой возникла ошибка. Если вы заметили появление ошибки при использовании одной программы, а в работе другого софта такого не замечено, самым правильным решением в данном случае будет скачать софт с официального сайта и установить. Только предварительно удалить с компьютера старую версию ПО. Возможно ошибка была связана с обновлением ПО, некачественным софтом, или коряво ломаным. А еще как вариант, можно обновить ПО до актуальной версии, или установить патчи которые доступны для программы.

Возможно вирусное заражение. Для начала нужно убедиться, что в папке с системными файлами присутствует файл KERNEL32.DLL а не kernel32.exe.

Если увидите нечто подобное в папке System32, значит, на компьютере имеются вирусы.

Следует проверить компьютер на наличие вирусов бесплатными утилитами, такими как Dr.Web Cureit! и Kaspersky Virus Removal Tool .

Ошибка при подключении любого оборудования. Бывают ситуации, когда ошибка выскакивает при подключении или активации оборудования. К примеру, при включении веб-камеры в Skype. То следует переустановить или обновить драйвер оборудования, в нашем случае веб-камера, до актуальной версии, также можно попробовать установить на одну версию ниже от актуальной. Обновление драйвера можно выполнить через «Диспетчер устройств». На фирменное оборудование драйвера можно скачать с сайта производителя.

Разгон процессора, видеокарты или изменили тайминги на оперативной памяти. Если проводили настройки по разгону процессора или видеокарты, памяти, это также может послужить причиной ошибки. Для решения необходимо вернуть все настройки в исходное состояние.

Произвести проверку системных файлов. Нужно запустить проверку системных файлов windows средствами ОС. Для этого запустите командную строку с правами администратора, наберите в строке sfc /scannow и нажмите Enter . Система выполнит проверку поврежденных файлов и по возможности восстановит их.

Возможны проблемы с оперативной памятью. Так как библиотека kernel32.dll отвечает за управление оперативной памятью в плане записи и чтения, проблема так же может скрываться за оперативкой. Для исключения проблем с оперативкой, ее нужно просканировать на наличие ошибок с помощью утилиты memtest86 или подобными аналогами, которых значительное количество. В случае обнаружения ошибок, необходимо заменить планку ОЗУ на заведомо рабочую.

Переустановите Windows. Если перечисленные способы не помогли, нужно переустановить ОС windows. Которые Вы всегда можете скачать с официального сайта Microsoft. Или перейти на более новую операционную систему. Скачать с официального сайта:

Возможны проблемы с жестким диском. Друзья, если после переустановки виндовс проблема не исчезла, следует проверить жесткий диск на наличие ошибок и битых секторов, которые так же могут послужить в возникновении ошибок с кернел32.

Для этого запустите командную строку с правами администратора, введите следующее. К примеру: chkdsk C: /f /r (где C: системный диск (по умолчанию) , f – проверка на наличие ошибок и их автоматическое восстановление, r – проверка поврежденных секторов и их восстановление)

Я показал на примере другой диск. В вашем случае пишите букву системного диска, на котором установлена ОС.

Вы всегда можете воспользоваться другими утилитами для проверки состояния вашего жесткого диска, такими как Victoria 4.47 или MHDDTest .

P.S. Подводя итоги, хотелось бы добавить от себя, что ошибка «не найдена точка входа в процедуру в библиотеке dll kernel32.dll» может быть связана с устаревшей версией Windows XP, на более современных ОС ошибка возникает крайне редко, но и не исключены случаи ее появления. Если вы до сих пор используете windows xp sp1, sp2, задумайтесь об обновлении до sp3 или о переходе на более современные операционные системы, такие как windows 7, windows 8 или windows 10.

Так как Билл Гейтс делает все, чтобы пользователи спрыгнули с Windows XP. Даже все те кого устраивает ОС.

По требованиям к виндовс 10 не прожорлива и не требовательна, работает и на слабом железе. А стабильность и комфортность в работе на хорошем уровне.

Надеюсь статья поможет Вам в борьбе с ошибкой kernel32.dll. Будет великолепно, если Вы отпишитесь о том, какой способ подошел именно Вам, или Вы решили проблему другими способами. Поделитесь с другими людьми, которые ищут решение.

Все программное обеспечение постепенно развивается, поэтому появляются новые версии и варианты. Это касается также и операционных систем, таких как Windows. Постоянно выходят новые версии, которые обладают расширенным функционалом, поэтому создатели программного обеспечения и игр уже ориентируются на новые версии ОС. Соответственно, про старые постепенно забывают, и решать ошибки, связанные с ними, становится все тяжелее. Например, если у вас установлена операционная система Windows XP, то существует вероятность того, что вы встретитесь с ошибкой: "Точка входа в процедуру не найдена". Как с ней справиться? Что можно сделать, если с вами случилась эта неприятность?

В чем суть проблемы?

В первую очередь нужно разобраться с тем, когда у вас может появиться сообщение об ошибке: "Точка входа в процедуру не найдена". Все довольно просто, так как данная ошибка появляется в единственном случае - в процессе загрузки системы. Как уже было сказано ранее, у вас должна быть установлена операционная система Windows XP, так как данная ошибка является характерной исключительно для этой ОС. Итак, когда у вас происходит загрузка системы, внезапно появляется сообщение о том, что точка входа в процедуру не найдена с единственной кнопкой, на которую вы можете нажать - "ОК". Когда вы на нее нажимаете, экран становится полностью белым, на нем остается только курсор, то есть мышь работает, но вы ни на что не можете кликнуть. Также клавиатура отключается, поэтому вы не можете использовать никакие из экстренных комбинаций.

В чем причина?

Если вы увидели перед собой сообщение об ошибке: "Точка входа в процедуру не найдена", то вам нужно знать, что причина заключается в том, что буфер системы переполнен, но при этом он не может быть очищен. Дело в том, что иногда вирус или дополнительное программное обеспечение может быть установлено на компьютер, и это повлияет на файл Msvcrt.dll - библиотеку системы, в которой есть функция resetstkoflw, отвечающая за механизм запуска очистки буфера при его переполнении. Другая версия может не содержать этой функции, и поэтому и возникает такая проблема. Собственно говоря, данная ошибка может касаться не только операционной системы, но и других программ - тогда будет появляться сообщение "Точка входа в процедуру Except не найдена", то есть название процедуры будет заменяться. Причины здесь все те же - замена необходимого файла другим, который не может провести очистку буфера. Но пример с операционной системой - самый яркий, поэтому на него стоит обратить особое внимание.

Основной этап

Самое первое, что вам нужно сделать - это отыскать оригинальную версию файла, который отвечает за восстановление переполненного буфера. Здесь не важно, идет речь об операционной системе или о компьютерной игре, например, о проекте "Сталкер". "Точка входа в процедуру не найдена" - это очень распространенная ошибка, которую можно встретить во многих местах. Но решение у нее лишь одно - вам нужно получить доступ к оригинальному файлу и заменить им тот, который не содержит нужной функции. Именно это действие и поможет вам избавиться от ошибки "Точка входа в процедуру не найдена". Естественно, в случае с компьютерными играми это будет довольно просто, так как система уже загружена, и вы можете проводить различные действия с ней. Но если же проблема возникла именно с операционной системой, вам нужно будет проделать более сложную цепочку действий.

Шаг первый

Что ж, случилось неприятное, и ваша операционная система Windows XP не запускается по описанной выше причине - как исправить? "Точка входа в процедуру не найдена" - которая не позволит вам ничего сделать, когда вы увидите перед собой Соответственно, вам нужно действовать раньше. Вставляйте в дисковод свой диск с ОС и загружайтесь с него, а не с жесткого диска - для этого вам в параметрах BIOS нужно будет изменить приоритет загрузки. Когда это будет сделано, вы сможете загрузить систему с диска, а не со своего винчестера, что позволит вам предпринять определенные действия по исправлению сложившейся неприятной ситуации.

Шаг второй

К сожалению, восстановление нужного вам файла - это далеко не самый простой процесс, его вам придется выполнять через Ошибка: "Точка входа в процедуру не найдена" может доставить вам немало неприятностей, поэтому рекомендуется всегда иметь на съемном носителе резервную копию нужного вам файла. Если же его у вас нет - запускайте консоль восстановления, когда увидите на экране приветственную надпись мастера установки операционной системы. Делается это с помощью нажатия кнопки R. Естественно, просто так вам доступ не дадут, поэтому придется еще немного поработать.

Шаг третий

Теперь вам нужно будет ввести ключ установки, который предоставит вам доступ к консоли - иначе у вас ничего не получится. Чаще всего такие ключи пишутся на упаковке диска или же на самом диске. Если же у вас виртуальная копия диска, то ключ достается вам в текстовом файле. Но вам стоит обратить внимание на то, что с помощью виртуального диска вам не удастся проделать всю эту операцию, так как загружать его надо уже из готовой системы, а вы туда сейчас попасть не можете.

Шаг четвертый

Учитывая тот факт, что вы все же будете изменять параметры вашей текущей операционной системы, вам также предстоит получить доступ и к ней. Для этого вам нужно будет ввести имя компьютера, а также пароль администратора. Задача упрощается, если у вас открытый доступ к компьютеру и нет пароля - тогда вам просто нужно перейти к следующему и завершающему шагу. Если же пароль присутствует, вам нужно будет его ввести, иначе у вас не получится проделать дальнейшие действия, которые и спасут вас от проблемы. Как видите, если у вас присутствует ошибка; "Точка входа в процедуру Convertinterfaceluidtoguid не найдена", то есть если она относится к любой другой процедуре, то проблема становится значительно мене серьезной. Но если же речь идет об операционной системе, то подготовьтесь к серьезной работе. Но к счастью, сейчас наступает ее завершительный этап.

Шаг пятый

Наконец, вы оказались в консоли восстановления, где вам нужно будет использовать определенный команды, которые приведут в итоге к тому, чего вы и хотели - к восстановлению оригинальной версии файла. Переходите в нужный раздел с помощью команды cd system32, а затем принимайтесь за пошаговый процесс удаления новой версии файла и его восстановлению с диска, который вставлен в ваш дисковод. Если все будет введено правильно, а процесс завершится успешно, то вы сможете достать диск и загрузить операционную систему без особых проблем. Если вы изменяли то вам снова нужно будет туда заглянуть, иначе ваш компьютер будет пытаться загрузить вашу операционную систему именно с дисковода, а не с вашего жесткого диска. Вот и все, вы справились с восстановлением файла, который теперь будет очищать буфер при его заполнении, тем самым обезопасив ваш компьютер от опасности повторного возникновения такой проблемы. Но если все же что-то случится, то теперь вы знаете, как нужно действовать, поэтому сможете справиться с проблемой довольно быстро - просто всегда нужно иметь под рукой диск с операционной системой Windows XP или же съемный носитель, на котором будет изначальная версия нужного вам файла.

Поддержка Windows XP

Однако в первую очередь вам стоит задуматься не о том, как обойти операционную систему Windows XP, а о том, как вам без нее обойтись. Дело в том, что в 2014 году компания Microsoft официально заявила, что больше не осуществляет официальную поддержку данной ОС, то есть по ней не работает техподдержка, к ней не выпускают обновления и так далее. Проще говоря, эта операционная система полностью устарела и вышла из обращения - вы можете ей пользоваться, но снова приобрести ее не сможете. Соответственно, вам лучше задуматься о том, чтобы сменить ОС на одну из новых версий - особенно с учетом того, что Windows 7 приобрела невероятную популярность и ничем не хуже, а только намного лучше, чем XP. Но если вы еще не готовы к смене ОС, то вам лучше изучить данную инструкцию, чтобы при возникновении подобной проблемы у вас не было вопросов.

С выходом.NET Framework 4.0 в состав BCL была добавлена библиотека Task Parallel Library (TPL), реализующая параллелизм на основе задач. В основе библиотеки лежат типы Task и унаследованный от него тип Task . Эти типы являются обёртками для асинхронных операций; они позволяют абстрагироваться от таких технических деталей, как, например, потоки и синхронизировать асинхронные операции друг с другом.

В этой же версии.NET Framework появился мини-framework для кооперативной отмены асинхронных операций. Состоит он из всего трёх типов:

  • CancellationTokenSource - создаёт маркёры отмены (свойство Token) и обрабатывает запросы на отмену операции (перегруженные методы Cancel / CancelAfter).
  • CancellationToken - маркёр отмены; позволяет несколькими способами отслеживать запросы на отмену операции: опросом свойства IsCancellationRequested , регистрацией callback-функции (через перегруженный метод Register), ожиданием на объекте синхронизации (свойство WaitHandle).
  • OperationCanceledException - исключение, выброс которого по соглашению означает, что запрос на отмену операции был обработан и операция должна считаться отменённой. Предпочтительный способ генерации исключения - вызов метода CancellationToken. ThrowIfCancellationRequested .
Механизм отмены через CancellationToken является стандартным для TPL - есть перегрузки методов, принимающих CancellationToken , исключения OperationCanceledException специальным образом обрабатываются и т.д. Однако, как и в любом другом API, есть свои тонкости, хитрости, best practices.

Почему отмена кооперативная?

Код, выполняющий асинхронную операцию, можно условно поделить на три части (слоя):
  • Код «вокруг» асинхронной операции, внешний слой. Этот код инициирует операцию, обрабатывает её результат и исключения, возникшие при выполнении операции.
  • Код «внутри» асинхронной операции, внутренний слой. Этот код реализует саму операцию, выполняет полезную нагрузку - расчёты, ввод/вывод, обработку данных и т.п.
  • Код-посредник между внешним (1) и внутренним (2) кодом, инфраструктурный слой. Он отвечает за низкоуровневые детали - запускает операцию на выполнение в нужном потоке, публикует результат выполнения операции, чтобы он был доступен внешнему коду и т.д. В случае использования TPL этот код находится внутри самой TPL.
Механизм отмены через CancellationToken является кооперативным, потому что требует согласованной поддержки функционала отмены от всех трёх слоёв. Типичный код, выполняющий асинхронную операцию с поддержкой отмены, выглядит так:
CancellationTokenSource cts; void Start() { cts = new CancellationTokenSource(); // Запускаем асинхронную операцию var task = Task.Run(() => SomeWork(cts.Token), cts.Token); // После окончания операции обрабатываем результат/отмену/исключения // ... } int SomeWork(CancellationToken cancellationToken) { int result; while (true) { // Что-то делаем... // ... и периодически проверяем, не запрошена ли отмена операции cancellationToken.ThrowIfCancellationRequested(); } // Возвращаем результат return result; } void Cancel() { // Запрашиваем отмену операции cts.Cancel(); }
В этом примере код в функциях Start и Cancel - внешний слой. Он инициирует выполнение асинхронной операции вызовом метода Task.Run . При этом он передаёт CancellationToken сразу в два места: во внутренний слой, непосредственно выполняющий операцию (метод SomeWork) и в инфраструктурный слой (второй аргумент функции Task.Run). Функция Cancel запрашивает отмену операции.

Внутренний слой (функция SomeWork) помимо выполнения полезной нагрузки периодически проверяет, не запрошена ли отмена и, если надо, генерирует исключение OperationCanceledException , сигнализирующее о том, что запрос на отмену был обработан.

Инфраструктурный слой (внутри TPL) для поддержки отмены делает две вещи. Во-первых, перед запуском переданной в Task.Run функции проверяет, не запрошена ли отмена. Если да, то функция даже не запускается на выполнение. Во-вторых, специальным образом обрабатывает исключение OperationCanceledException , сообщающее об отмене операции.

Обработка запроса на отмену

После вызова метода CancellationTokenSource.Cancel (или по истечении таймаута, заданного при вызове конструктора CancellationTokenSource /метода CancellationTokenSource.CancelAfter) объект CancellationTokenSource переходит в отменённое состояние. Переход в отменённое состояние может произойти ровно один раз. Передумать и сделать отменённый CancellationTokenSource неотменённым невозможно, а повторные вызовы Cancel игнорируются.

При переходе в отменённое состояние вызываются callback-функции, зарегистрированные через метод CancellationToken.Register , свойство CancellationToken.IsCancellationRequested начинает возвращать true , а вызов метода CancellationToken.ThrowIfCancellationRequested будет генерировать исключение OperationCanceledException .

Код внутреннего слоя должен периодически проверять наличие запроса на отмену. Как правило, код проверки сводится к вызову метода ThrowIfCancellationRequested , если операция может быть прервана сразу. Если перед завершением работы нужно выполнить дополнительные действия (например, освободить используемые ресурсы), то код проверки обращается к свойству IsCancellationRequested . Если оно равно true , выполняется очистка ресурсов и генерируется исключение OperationCanceledException (опять же вызовом метода ThrowIfCancellationRequested или вручную).

Здесь важно обратить внимание на следующее. Во-первых, если запрос на отмену не будет обработан кодом операции, операция продолжит выполняться. В конце концов, когда операция завершится (штатно или с исключением), задача станет завершённой (Task.IsCompleted == true), но она не будет считаться отменённой (Task.IsCanceled == false).

Во-вторых, нужно подобрать оптимальный размер интервала между проверками. Если интервал будет слишком большой, операция будет выполнять лишнюю работу в случае отмены. Если интервал будет слишком маленький - накладные расходы на проверку увеличат время выполнения операции. Какие-то конкретные значения порекомендовать сложно, многое зависит от конкретного сценария. Общие рекомендации такие: если вероятность отмены не очень велика, проверки можно выполнять реже. Если отмена операции инициируется пользователем, для обеспечения отзывчивости UI достаточно выполнять проверку каждые 200-250 мс. Если операция выполняется в серверном приложении, проверки стоит выполнять чаще, чтобы в случае отмены не тратить впустую ресурсы сервера. Проверки не должны занимать больше нескольких процентов от общего времени выполнения операции. Опять же, повторюсь, что это всего лишь общие рекомендации и в каждом конкретном случае разработчик должен сам принимать решение с учётом всех влияющих факторов. Возможно, не лишней окажется помощь профилировщика.

В-третьих, у CancellationToken есть свойство CanBeCanceled . Если оно возвращает false , то запроса на отмену гарантированно не будет и проверки можно не выполнять. CanBeCanceled равно false , если CancellationToken получен с помощью статического свойства CancellationToken.None или создан конструктором по умолчанию или конструктором с параметром, равным false .

И, наконец, в-четвёртых, чтобы выполняемая задача, которая была создана «вручную» (не async-методом), корректно отменилась (чтобы свойство Task.IsCanceled возвращало true), необходимо следующее:

  • Код асинхронной операции должен сгенерировать исключение OperationCanceledException , в конструктор которого должен быть передан CancellationToken .
  • Тот же самый CancellationToken должен передаваться в метод, который создаёт и запускает задачу.
  • Свойство IsCancellationRequested у CancellationToken должно возвращать true .
Рассмотрим примеры:
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; //... Task.Run(() => { //... if (cancellationToken.IsCancellationRequested) throw new OperationCanceledException(); // Забыли передать CancellationToken //... }, cancellationToken);
Здесь в конструктор OperationCanceledException не передаётся CancellationToken . Именно поэтому предпочтительно использовать метод CancellationToken.ThrowIfCancelationRequested , а не генерировать OperationCanceledException вручную.

Var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; //... Task.Run(() => { //... cancellationToken.ThrowIfCancellationRequested(); //... }/* Забыли передать CancellationToken */);
В этом примере при создании задачи в метод Task.Run не был передан CancellationToken .

Var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var cts2 = new CancellationTokenSource(); var cancellationToken2 = cts2.Token; //... var task = Task.Run(() => { //... cancellationToken2.ThrowIfCancellationRequested(); // «Чужой» CancellationToken //... }, cancellationToken);
Здесь для создания задачи и для отмены используются CancellationToken ’ы, полученные из разных CancellationTokenSource ’ов.

Var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; //... var task = Task.Run(() => { //... if (!cancellationToken.IsCancellationRequested) // Отмена не запрошена throw new OperationCanceledException(cancellationToken); //... }, cancellationToken);
Тут генерируется OperationCanceledException , хотя отмена запрошена не была.

Во всех примерах исключение OperationCanceledException будет обработано внутри TPL не как сигнал об отмене, а как обычное исключение. В результате задача завершится не с отменой, а с ошибкой (Task.IsCancelled == false , Task.IsFaulted == true).

Отмена и задачи-продолжения

TPL позволяет с помощью перегруженного метода Task.ContinueWith объединять задачи в цепочки. Задача, созданная методом Task.ContinueWith , называется задачей-продолжением, а задача, у которой вызывался метод - задачей-предшественником. Задача-продолжение ожидает завершения задачи-предшественника, после чего выполняется:
var antecedentTask = Task.Run(() => Console.Write("Hello, ")); var continuationTask = antecedentTask.ContinueWith(_ => Console.Write("world!")); // Выведет на консоль `Hello, world!`
Задачи-продолжения в полной мере поддерживают отмену и все, что было написано выше, применимо и к ним. У метода Task.ContinueWith есть перегрузки, позволяющие связать с создаваемой задачей CancellationToken .

Если запрос на отмену придет, когда задача-продолжение ещё не начала выполняться, она выполняться не будет. При этом, по умолчанию, задача-продолжение отменится сразу и может завершиться раньше, чем задача-предшественник:
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var antecedentTask = Task.Run(() => Thread.Sleep(5000)); var continuationTask = antecedentTask.ContinueWith(_ => {}, cancellationToken); Thread.Sleep(1000); cts.Cancel(); Console.WriteLine(antecedentTask.IsCompleted); // False Console.WriteLine(continuationTask.IsCompleted); // True
Но такое поведение можно изменить, если при создании задачи-продолжения с помощью флага TaskContinuationOptions.LazyCancellation указать, что требуется «ленивая» отмена. В этом случае задача-продолжение не отменится (и не завершится), пока не завершится задача-предшественник:
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; var antecedentTask = Task.Run(() => Thread.Sleep(5000)); var continuationTask = antecedentTask.ContinueWith(_ => {}, cancellationToken, TaskContinuationOptions.LazyCancellation, TaskScheduler.Default); Thread.Sleep(1000); cts.Cancel(); Console.WriteLine(antecedentTask.IsCompleted); // False Console.WriteLine(continuationTask.IsCompleted); // False
Отдельный интерес представляет случай, когда задача-продолжение может стать отменённой без использования CancellationToken . В TaskContinuationOptions есть ряд флагов, которые позволяют указать, в каких случаях задача-продолжение должна запускаться. Например, для задачи-предшественника можно создать две задачи-продолжения - одну на случай, когда задача-предшественник выполнится нормально, вторую - на случай, когда в задаче-предшественнике произойдёт ошибка/отмена. После завершения задачи-предшественника запустится только одна из задач-продолжений, а вторая станет отменённой:
var antecedentTask = Task.Run(() => {}); var continuationTask1 = antecedentTask.ContinueWith(_ => {}, TaskContinuationOptions.OnlyOnRanToCompletion); var continuationTask2 = antecedentTask.ContinueWith(_ => {}, TaskContinuationOptions.NotOnRanToCompletion); try { Task.WaitAll(continuationTask1, continuationTask2); } catch{} Console.WriteLine(continuationTask1.IsCanceled); // False Console.WriteLine(continuationTask2.IsCanceled); // True

Отмена и async-методы

В C# 5.0 появились async-методы . С точки зрения отмены async-методы интересны тем, что в качестве возвращаемого значения могут использовать только void и типы Task / Task. Причём в случае, когда async-метод возвращает задачу (Task / Task), эта задача создаётся неявно, сгенерированным компилятором кодом. Например, такой код
Task task = Task .Delay(TimeSpan.FromSeconds(5)) .ContinueWith(_ => { while (true) { // Что-то делаем } return 42; });
может быть переписан с помощью async-методов следующим образом:
Task task = SomeWork(); async Task SomeWork() { await Task.Delay(TimeSpan.FromSeconds(5)); while (true) { // Что-то делаем } return 42; }
Обратите внимание, в коде нет никаких Task.Run , ни Task.Factory.StartNew , ничего такого. Метод SomeWork возвращает значение типа int . Компилятор сам генерирует код, который заворачивает тело SomeWork в Task.

Задачи, возвращаемые async-методами, как и задачи, созданные вручную, могут быть отменены. Если добавить поддержку отмены в примеры выше, они будут выглядеть так:
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task task = Task .Delay(TimeSpan.FromSeconds(5), cancellationToken) .ContinueWith(_ => { while (true) { // Что-то делаем cancellationToken.ThrowIfCancellationRequested(); } return 42; }, cancellationToken);
и
var cts = new CancellationTokenSource(); var cancellationToken = cts.Token; Task task = SomeWork(cancellationToken); async Task SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); /* 1 */ await Task.Delay(TimeSpan.FromSeconds(5), cancellationToken); cancellationToken.ThrowIfCancellationRequested(); /* 2 */ while (true) { // Что-то делаем cancellationToken.ThrowIfCancellationRequested(); } return 42; }
Задача, возвращаемая из async-метода, создаётся неявно, поэтому с ней никак нельзя связать CancellationToken (передача CancellationToken в async-метод через аргумент не связывает этот CancellationToken с возвращаемой задачей). Этот факт имеет два важных последствия:

  • Даже если отмена была запрошена до вызова async-метода, тело async-метода всё равно будет выполняться. В случае с ручным созданием задачи (например, через Task.Run или Task.ContinueWith) это не так. Именно поэтому в примере присутствуют проверки 1 и 2.
  • Исключения, возникшие внутри async-метода, обрабатываются сгенерированным компилятором кодом. OperationCanceledException считается отменой операции. При этом CancellationToken , переданный в конструктор исключения ни с чем не сравнивается, т.к. сравнивать его не с чем. Более того, для отмены достаточен сам факт исключения нужного типа, а наличие CancellationToken и его состояние никак не анализируется. Поэтому, в отличие от того же Task.Run , любой из нижеперечисленных способов приведёт к отмене:
static async Task SomeWork(CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); throw new OperationCanceledException(cancellationToken); throw new OperationCanceledException(); throw new OperationCanceledException(CancellationToken.None); throw new OperationCanceledException(new CancellationToken(true)); throw new OperationCanceledException(new CancellationToken(false)); }

Обработка отменённых задач

После завершения задачи свойство Task.IsCompleted начинает возвращать значение true . Завершится задача может штатно (Task.Status == TaskStatus.RanToCompletion), с ошибкой (Task.Status == TaskStatus.Faulted ; Task.IsFaulted == true) или с отменой (Task.Status == TaskStatus.Canceled ; Task.IsCanceled == true). С помощью этих свойств можно определить завершилась ли задача и как она завершилась.

Обработать завершённую задачу можно с помощью задач-продолжений. При этом удобно пользоваться флагами TaskContinuationOptions и создавать задачу-продолжение на каждый вариант завершения задачи-предшественника:
var task = Task.Run(() => 42); task.ContinueWith(t => Console.WriteLine("Result: {0}", t.Result), TaskContinuationOptions.OnlyOnRanToCompletion); task.ContinueWith(_ => Console.WriteLine("Canceled"), TaskContinuationOptions.OnlyOnCanceled); task.ContinueWith(t => Console.WriteLine("Error: {0}", t.Exception), TaskContinuationOptions.OnlyOnFaulted);
Дождаться завершения задачи и обработать её результат можно с помощью метода Task.Wait или обращением к свойству Task.Result. При этом если задача завершится c ошибкой или отменой, будет выброшено исключение. Здесь есть две тонкости. Во-первых, это исключение всегда будет одного и того же типа - AggregateException . AggregateException является контейнером для одного или нескольких исключений, возникших при выполнении задачи (подробнее про AggregateException можно почитать ). Во-вторых, в случае, когда задача отменена, AggregateException будет содержать в себе исключение TaskCanceledException , а не OperationCanceledException , что несколько неочевидно:
var task = Task.Run(() => { /* Что-то делаем */ }); try { task.Wait(); Console.WriteLine("Success"); } catch (AggregateException ae) { try { ae.Flatten().Handle(e => e is TaskCanceledException); Console.WriteLine("Cancelled"); } catch (AggregateException e) { Console.WriteLine("Error: {0}", e); } }
В случае async-методов дождаться и обработать результат задачи можно с помощью ключевого слова await . При этом сгенерированный компилятором код разворачивает AggregateException , а для отменённой задачи выбрасывается исключение OperationCanceledException ; обработка исключений выглядит более естественно:
var task = Task.Run(() => { /* Что-то делаем */ }); try { await task; Console.WriteLine("Success"); } catch (OperationCanceledException) { Console.WriteLine("Cancelled"); } catch (Exception e) { Console.WriteLine("Error: {0}", e); }

В последних билдах Windows 10 некоторые пользователи при входе в Магазин сталкиваются со странной ошибкой . На первый взгляд может показаться, что её причина заключается в повреждении файла библиотеки WSClient.dll , но на самом деле всё гораздо проще. Магазин Windows тщательно следит за публикуемыми в нём разработчиками приложениями и, если обнаруживает, что какое-то приложение не соответствует требованиям безопасности, тут же заносит его в список запрещённых для установки.

Этот список загружается на компьютер пользователя каждый раз, когда тот входит в Магазин. Если по какой-то причине список не был получен должным образом, выводится сообщение об ошибке, в данном примере «WSClient.dll нет точки входа: RefreshBannerAppsList» . В Microsoft об этой ошибке уже известно и в следующих обновлениях разработчики обещают полностью устранить её причины.

Пока же при её появлении они советуют выполнить следующие действия. Для начала вы можете попробовать сбросить кэш Магазина Windows. Для этого в командной строке или окошке Run (Win + R) необходимо выполнить команду wsreset .

Есть ещё один способ, однако применять его не рекомендуется, так как он создаёт брешь в безопасности системы. Если отключить синхронизацию списка запрещенных приложений, сообщение об ошибке появляться не будет. Через апплет панели управления «Администрирование» откройте Планировщик заданий , разверните ветку Библиотека Планировщика Заданий -> Windows -> WS , в средней колонке окна найдите задачу и отключите её.

Также можно удалить задачу из Планировщика. Откройте от имени администратора командную строку и выполните в ней такую команду:

schtasks /delete /TN "\Microsoft\Windows\WS\WSRefreshBannedAppsListTask" /F

Многие пользователи, установившие сборку Windows 10 11099 получают сообщение об ошибке каждый раз, когда входят в свой ​​аккаунт в Windows Store . «Ошибка WSClient.dll нет точки входа: RefreshBannerAppsList»

Если у вас наблюдается эта проблема, вот что вы должны сделать.

Windows Store поддерживает и обновляет список запрещенных приложений время от времени. Благодаря этой процедуре, Windows 10 знает, какие приложения являются небезопасными и не должны устанавливатся на компьютеры конечного пользователя. Сообщение об ошибке указывает, что список запрещенных приложений не был получен должным образом.

Есть несколько известных способов предотвратить сообщение об ошибке.

Первый способ.

Откройте командную строку от имени администратора и выполните следующую команду:

Schtasks/delete/TN“\Microsoft\Windows\WS\WSRefreshBannedAppsListTask”/F

Второй способ.

Для исправления " Ошибка WSClient.dll нет точки входа: RefreshBannerAppsList" , вы должны сбросить кеш Windows Store.

  • Нажмите Win + R на клавиатуре, чтобы открыть диалоговое окно Выполнить.
  • Введите или скопируйте следующее в поле Выполнить:
  • Нажмите Ввод .

Инструмент удалит кэша Store. Это может занять несколько минут, так что будьте терпеливы. Если это не помогает, попробуйте второй способ. Как правило ошибка WSClient.dll , перестанет вас беспокоить.

Третий способ заключается в отключении синхронизации списка запрещенных приложений. Хотя это не очень хорошая идея для рабочего компьютера, вы можете использовать этот трюк в качестве обходного пути для инсайдерской сборки Windows 10 11099.

Выполните следующие действия:

Откройте Панель управления.

Перейдите - Панель управления \ Система и безопасность \ Администрирование. Нажмите на иконку :


В левой панели, откройте следующий путь:

Библиотека Планировщика Заданий\ Microsoft \ Windows \ WS

В правой панели найдите задачу.

Щелкните правой кнопкой мыши и выберите в контекстном меню "Отключить" .

Это отключит сообщение об ошибке, список запрещенных приложений больше не будет синхронизироваться. Вы сможете включить синхронизацию обратно в любой момент, разрешив задачу в Планировщике.