Диспетчер.NET, для.NET Core?

Делает что-то вроде Dispatcher существует для.NET Core?

Мне нужно создать поток в.NET Core и иметь возможность отправлять действия, которые будут вызываться в потоке. Кроме того, я хотел бы иметь возможность использовать TaskScheduler которые могут быть использованы для async/await вещи.

Это где-то существует?

6 ответов

Решение

Это не встроенный, но мой AsyncContext а также AsyncContextThread типы доступны в библиотеке, которая соответствует вашим потребностям.

AsyncContext принимает текущий поток:

AsyncContext.Run(async () =>
{
  ... // any awaits in here resume on the same thread.
});
// `Run` blocks until all async work is done.

AsyncContextThread это отдельная тема со своим AsyncContext:

using (var thread = new AsyncContextThread())
{
  // Queue work to the thread.
  thread.Factory.Run(async () =>
  {
    ... // any awaits in here resume on the same thread.
  });
  await thread.JoinAsync(); // or `thread.Join();`
}

AsyncContext обеспечивает SynchronizationContext также как и TaskScheduler / TaskFactory,

Как ссылка: вы можете сделать как ответы codevision, так и JBSnorro:

Отредактируйте файл.csproj вручную. Файл проекта должен выглядеть примерно так (для Core 3.1 используйте 3.1 вместо 3.0):

<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.0</TargetFramework>
        <UseWPF>true</UseWPF>
    </PropertyGroup>
</Project>

Если проект выгружен, используйте "Перезагрузить проект" в меню содержимого.

Примечание. Необходимо добавить UseWPF, но также следует изменить тип "Project Sdk".

С.NET Core 3.0 теперь вы можете использовать Dispatcher класс, но он будет работать только в Windows, а под netcoreapp3.0 TFM, поэтому вы не можете развернуть свое приложение на Linux или Mac.

Вы должны добавить в свой проект CSharp следующий параметр

<PropertyGroup>
   ...
   <UseWPF>true</UseWPF>
   ...
</PropertyGroup>

а затем вы можете использовать System.Windows.Threading.Dispatcher в вашем приложении.

Убедитесь, что ссылка на SDK в.csproj указывает на Microsoft.NET.Sdk.WindowsDesktop, смотрите здесь.

Я не верю, что в .NET Core есть встроенная кросс-платформенная система. Однако большинство библиотек, имитирующих WPF и WinForms на других платформах, имеют свои собственные диспетчеры/вызовчики для поддержки многопоточности:

  • Авалония Avalonia.Threading.Dispatcher- МимикиSystem.Windows.Threading.Dispatcher. Вероятно, это будет ваше самое кроссплатформенное решение ( API | Исходный код ).

  • GTKSharp's Gtk.Application.Invoke- Имитирует WinFormControl.Invoke(Документация | Исходный код )

Еще есть Monodevelop DispatchService

Если вы хотели сделать это, пытаясь изменить элементы пользовательского интерфейса, вы можете использовать Invoke на контроле

      Label1.Invoke((MethodInvoker) delegate {
    Label1.Text = "newtext";
});
Другие вопросы по тегам