Thread.Sleep() в портативной библиотеке классов
В документах MSDN Thread.Sleep()
можно использовать в переносной библиотеке классов. Компилятор говорит иначе. Каковы мои альтернативы, кроме спин-петли? Thread.CurrentThread.Join()
также не существует.
Файл проекта:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{C46B138E-CC30-4397-B326-8DD019E3874B}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>x0xtest.AVR</RootNamespace>
<AssemblyName>x0xtest.AVR</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile3</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
</ItemGroup>
<ItemGroup>
<Compile Include="Attributes\AddressAttribute.cs" />
<Compile Include="Attributes\RegAttribute.cs" />
<Compile Include="Attributes\ROAttribute.cs" />
<Compile Include="Attributes\RWAttribute.cs" />
<Compile Include="Attributes\WOAttribute.cs" />
<Compile Include="Devices\ATMega162.cs" />
<Compile Include="Exceptions.cs" />
<Compile Include="IntelHexFormat.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Proxy.cs" />
<Compile Include="ProxyBase.cs" />
<Compile Include="ProxyBase_UploadFirmware.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\x0xtest.Comm\x0xtest.Comm.csproj">
<Project>{F78547AC-1CA1-4ADB-9FA8-3E7DEB682240}</Project>
<Name>x0xtest.Comm</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
Ответы
Ответ 1
Это неудачный побочный эффект "портативного". Библиотека становится очень переносимой путем вычитания, удаляя все части, которые недоступны только для одной из многих возможных целей. Это сыграло хаос с классом Thread, оно совершенно лишено каких-либо полезных членов. Всего 5 из них - MemoryBarrier(), CurrentCulture, CurrentThread, CurrentUICulture и ManagedThreadId.
Это может показаться странным, пересечение объявленных целей, безусловно, поддерживает больше. Вероятно, это связано с не рекламируемым. Предстоящая версия Windows 8, которая будет работать на ядрах ARM. В противном случае, как WinRT или Metro, или API приложений .NET для Metro, в зависимости от того, какие инструменты вы используете. WinRT серьезно сокращает традиционный Windows API, пространство имен System.Windows.Threading довольно пусто.
Это создаст массу вопросов о SO, "Eeek, now what do я do do". Возможное обходное решение здесь - сжечь фиктивный объект System.Threading.ManualResetEvent. Он имеет метод WaitOne (TimeSpan).
Fwiw, я лично не ожидаю программирования против этой библиотеки. Безусловно, самый тревожный лакомый кусочек находится в разделе Q & A ссылки, которую вы указали:
В: Я хотел спросить, что с помощью метода компиляции Класс System.Linq.Expressions.Expression.
О: Он не поддерживается на Windows Phone/Xbox, поэтому он появляется только при настройке Silverlight +.NET.
Уч. Портативный, спортивный. Это нужно немного тушить. Мои симпатии к DevDiv вообще и Дэвиду Кину в частности, тяжелая работа.
Ответ 2
(я "владею" проектом портативной библиотеки в Microsoft)
К сожалению, это было последним изменением области поверхности проекта Portable Library, которую мы сделали, чтобы мы могли запускать и ссылаться на приложения Metro. Одна из новых вещей с приложениями в стиле Metro, Visual Studio 11 и Windows 8 - избавить пользователей от необходимости создавать и контролировать свои собственные потоки (что сложно сделать правильно). Вместо этого идея состоит в том, что вы используете язык (т.е. async
/await
) и функции структуры (Task
) для выполнения и синхронизации с операциями, которые должны выполняться в фоновом режиме.
Что использовать в качестве замены (например, ManualResetEvent
, Task.Delay
), полностью зависит от вашего сценария и от того, на каких платформах вы нацеливаетесь. Можете ли вы объяснить, что вы делаете?
Ответ 3
System.Threading.Tasks.Task.Delay(ms).Wait();
работает как замена для
System.Threading.Thread.Sleep(ms);
Это прекрасно работает при переносе устаревшей базы кода.
Ответ 4
Попробуйте подождать http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx с таймаутом.
Ответ 5
Вы можете использовать Task.Delay
в System.Threading.Tasks