2012-02-12 5 views
21

В MSDN документов говорят Thread.Sleep() можно использовать в библиотеке классов портативного. Компилятор говорит иначе. Каковы мои альтернативы, кроме спин-петли? Thread.CurrentThread.Join() также не существует.Thread.Sleep() в портативных библиотеках классов

файл проекта:

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

Что компилятор говорит? Короткий, но полный пример, включая сообщение об ошибке, поможет. –

+2

Проблема, вероятно, в настройке/конфигурации вашего проекта, но вы будете использовать пользователей lib в качестве плода. Поэтому не решайте эту проблему, но избавляйтесь от Sleep(). –

+1

Согласитесь с @HenkHolterman здесь (я думаю). Какую проблему вы пытаетесь решить *, что заставляет вас думать, что «Thread.Sleep» - правильное решение? –

ответ

25

Это неудачный побочный эффект от «портативных». Библиотека становится очень переносимой путем вычитания, удаляя все части, которые недоступны только для одной из многих возможных целей. Это сыграло хаос с классом 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 I do». Возможное обходное решение здесь - сжечь фиктивный объект System.Threading.ManualResetEvent. Он имеет метод WaitOne (TimeSpan).

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

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

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

+0

Я попытался найти ссылку для .NET для Metro, и похоже, что Thread.Sleep() находится там http://msdn.microsoft.com/en-us/library/windows/apps/d00bd51t(v=vs .85) .aspx Но, возможно, сайт документации просто запаздывает. http://msdn.microsoft.com/en-us/library/windows/apps/hh454043(v=vs.85).aspx четко говорит: «Документация для типа указывает, какие члены включены в .NET API для Приложения в стиле Metro ». –

+0

Я думаю, что правильный способ сделать это Метро-стиль - это 'await TaskEx.Delay' Является ли асинхронный материал в PCL? Я проверю, но не угадаю. –

+1

О, и ваш отличный ответ задает вопрос, как я могу настроить свой PCL для НЕ нацеленного метро? Предположительно VS 11 предлагает грануляцию? –

19

(I «собственного» портативного проект библиотеки в Microsoft)

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

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

+2

Вау, Дэвид Кин! У меня так много вопросов и неприятностей, чтобы сказать вам! Отвечать на то, что я делаю, - это запуск устройства с открытым исходным кодом через последовательный порт. Сначала в качестве настольного приложения, а затем переместился в Silverlight (используя P/Invoke или Java JNI ... SHAME на MS для уничтожения поддержки RS232 в Silverlight и Metro). Что касается потоков, я не использую их, но async/Task не заменяет их. Однопоточный! = Многопоточный. [This] (http://msdn.microsoft.com/en-us/library/windows/apps/br230302 (v = vs.110) .aspx # threading) все еще говорит о том, чтобы использовать класс Thread для длительных задач в Метро. –

+1

Что касается самого PCL, я вижу много бессмысленной несовместимости. PCL должен намного сложнее быть совместимым. Он должен быть толще и эмулировать части функциональности, которые являются 95% аналогами, но были «разделены при рождении». Например, у PCL нет Thread.Sleep() и Task.Delay(). Это просто удача, что у нее есть ManualResetEvent. Почему бы просто не включить Thread.Sleep() и скомпилировать его как ожидающий Task.Delay() на Metro? Почему нет Enum.GetValues ​​()? Почему нет ObservableCollection в .NET 4 ?! Etc, и т. Д. PCL почти бесполезен. –

+0

PCL должен иметь «лица» (пространства имен и классы для представления разработчику), так что классический .NET не становится стандартным и единственным лицом. Тогда он должен иметь то, на что он нацелен. Цели должны быть мелкозернистыми, а не на уровне сборки. И должен быть (некоторый) код прокладки для заполнения пробелов.Наконец, он должен распространяться на более широкий юниверс .NET, включая Micro Framework (например, Netduino). –

3

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

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

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

System.Threading.Thread.Sleep(ms); 

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

 Смежные вопросы

  • Нет связанных вопросов^_^