thread pause make c# portable-class-library

c# - pause - Thread.Sleep() en una biblioteca de clases portátil



timer sleep c# (5)

(Soy dueño del proyecto de biblioteca portátil en Microsoft)

Desafortunadamente, esto fue un cambio tardío en el área de superficie del proyecto de la Biblioteca portátil que hicimos para que podamos ejecutar y ser referenciados por las aplicaciones de Metro. Una de las novedades de las aplicaciones de estilo Metro, Visual Studio 11 y Windows 8 es eliminar la necesidad de las aplicaciones para crear y controlar sus propios hilos (lo que es difícil de lograr). En su lugar, la idea es que utilice el lenguaje (es decir, async / await ) y las funciones del marco ( Task ) para realizar y sincronizar con las operaciones que deberían ocurrir en segundo plano.

Lo que se debe usar como reemplazo (por ejemplo, ManualResetEvent , Task.Delay ), depende completamente de su escenario y de las plataformas a las que se dirige. ¿Puedes explicar lo que estás haciendo?

Los documentos de MSDN dicen que Thread.Sleep() se puede usar en una biblioteca de clases portátil . El compilador dice lo contrario. ¿Cuáles son mis alternativas además de un spin-loop? Thread.CurrentThread.Join() tampoco existe.

Archivo de proyecto:

<?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>


Este es el efecto secundario desafortunado de "portátil". Una biblioteca se vuelve altamente portátil por sustracción, eliminando todas las partes que no están disponibles en solo uno de los muchos objetivos posibles. Eso causó estragos en la clase Thread, ya que carece de miembros útiles. Solo quedan 5 de ellos, MemoryBarrier (), CurrentCulture, CurrentThread, CurrentUICulture y ManagedThreadId.

Esto puede parecer extraño, la intersección de los objetivos publicitados sin duda admite más. Esto probablemente está relacionado con el no publicitado. La próxima versión de Windows 8 que se ejecutará en los núcleos ARM. También conocido como WinRT o Metro o la API ".NET para aplicaciones de estilo Metro", según las herramientas que utilice. WinRT reduce severamente la API tradicional de Windows, su System.Windows.Shreading espacio de nombres está bastante vacío.

Esto va a generar un montón de preguntas sobre SO, el tipo "Eeek, ahora qué hago". La posible solución aquí es quemar un objeto System.Threading.ManualResetEvent ficticio. Tiene un método WaitOne (TimeSpan).

Fwiw, personalmente no estoy deseando programar contra esta biblioteca. Con mucho, el dato más alarmante se encuentra en la sección de Preguntas y Respuestas del enlace que proporcionó:

P: Quería preguntar qué pasa con el método de compilación de la clase System.Linq.Expressions.Expression.
R: No es compatible con Windows Phone / Xbox, por lo que solo aparece cuando apuntas a Silverlight + .NET.

Ay. Portátil, esportable. Esto necesita ser cocido por un tiempo. Mis simpatías por DevDiv en general y David Kean en particular, trabajo duro.



Puede usar Task.Delay en System.Threading.Tasks


System.Threading.Tasks.Task.Delay(ms).Wait();

funciona como un reemplazo para

System.Threading.Thread.Sleep(ms);

Esto funciona bien al trasladar una base de código heredada.