Диспетчер.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";
});