Thread.Sleep () в переносимой библиотеке классов - PullRequest
22 голосов
/ 12 февраля 2012

Документы 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>

Ответы [ 5 ]

25 голосов
/ 13 февраля 2012

Это неприятный побочный эффект «портативности».Библиотека становится очень переносимой благодаря вычитанию, удаляя все части, которые недоступны только для одной из множества возможных целей.Это вызвало хаос в классе Thread, оно лишено каких-либо полезных членов.Осталось только 5 из них, MemoryBarrier (), CurrentCulture, CurrentThread, CurrentUICulture и ManagedThreadId.

Это может показаться странным, пересечение объявленных целей, безусловно, поддерживает больше.Вероятно, это связано с нерекламированным.Предстоящая версия Windows 8, которая будет работать на ядрах ARM.Также известный как WinRT или Metro или API ".NET для приложений в стиле Metro" в зависимости от того, какие инструменты вы используете.WinRT сильно сокращает традиционный Windows API, его пространство имен System.Windows.Threading довольно пустое.

Это приведет к тонне вопросов по SO, "Eeek, теперьЧто я делаю?Возможный обходной путь - сжечь фиктивный объект System.Threading.ManualResetEvent.У него есть метод WaitOne (TimeSpan).

Кстати, я лично не с нетерпением жду программирования для этой библиотеки.Безусловно, самый тревожный лакомый кусочек находится в разделе вопросов и ответов предоставленной вами ссылки:

В: Я хотел спросить, что случилось с методом Compile класса System.Linq.Expressions.Expression.О: Он не поддерживается в Windows Phone / Xbox, поэтому он отображается только при использовании Silverlight + .NET.

Ой.Портативный, спортивный.Это нужно тушить некоторое время.Мои симпатии к DevDiv в целом и Дэвиду Кину в частности, тяжелая работа.

19 голосов
/ 19 февраля 2012

(мне принадлежит проект переносимой библиотеки в Microsoft)

К сожалению, это было поздним изменением площади поверхности проекта Portable Library, которую мы сделали, чтобы мы могли работать и на нее ссылались приложения Metro. Одна из новинок в приложениях в стиле Metro, Visual Studio 11 и Windows 8 - устранение необходимости в приложениях для создания и управления своими собственными потоками (что сложно сделать правильно). Вместо этого идея заключается в том, что вы используете язык (то есть async / await) и фреймворк (Task) для выполнения и синхронизации с операциями, которые должны выполняться в фоновом режиме.

Что использовать в качестве замены (например, ManualResetEvent, Task.Delay), полностью зависит от вашего сценария и на какие платформы вы нацеливаетесь. Можете ли вы объяснить, что вы делаете?

18 голосов
/ 24 июля 2015
System.Threading.Tasks.Task.Delay(ms).Wait();

работает как замена для

System.Threading.Thread.Sleep(ms);

Это прекрасно работает при переносе устаревшей кодовой базы.

5 голосов
/ 13 февраля 2012

Попробуйте подождать на http://msdn.microsoft.com/en-us/library/system.threading.manualresetevent.aspx с таймаутом.

4 голосов
/ 05 апреля 2015

Вы можете использовать Task.Delay в System.Threading.Tasks

...