Я новичок в задачах тем.
Как получить доступ к нужной задаче и вызвать метод для этой задачи? У задачи есть идентификатор, я дал ей имя и получил TaskScheduler.
Я получаю правильное исключение:
InvalidOperationException: вызывающий поток не может получить доступ к этому объекту, поскольку объект принадлежит другому потоку.
В Main я запускаю Задача с CustomSplashScreenViewModel.StartSplashScreenAsync(). Другие задачи запускаются и выполняются. При событии, когда все загрузилось, мне нужно закрыть SplashScreen.
Метод CustomSplashScreenViewModel.CloseSplash(_splashTask, _taskSchedulerSplash); получает эту информацию. Когда я его отлаживаю, _splashTask имеет значение «null», а в _taskSchedulerSplash он содержит _splashTask внутри.
Внутри метода CloseSplash мне нравится чтобы вызвать метод _view.Close() в _splashTask.
Как это решить?
public class Program
{
private static readonly SingleThreadTaskScheduler _taskSchedulerSplash = new SingleThreadTaskScheduler(ApartmentState.STA);
[ThreadStatic]
private static Task _splashTask;
// [STAThread]
public static async Task Main()
{
_splashTask = await Task.Factory.StartNew(() =>
{
return CustomSplashScreenViewModel.StartSplashScreenAsync();
}, _taskSchedulerSplash);
var taskScheduler = new SingleThreadTaskScheduler(ApartmentState.STA);
var taskList = new List();
var updateTask = Task.Run(InstallHelper.CheckForUpdatesAsync);
updateTask.Wait();
taskList.Add(updateTask);
var tasks = await Task.Factory.ContinueWhenAll(taskList.ToArray(), result => Task.Factory.StartNew( ()=>AppStart(container), taskScheduler));
tasks.Wait();
}
private static void App_MainWindowLoaded(object sender, EventArgs e)
{
CustomSplashScreenViewModel.CloseSplash(_splashTask, _taskSchedulerSplash);
}
}
public class CustomSplashScreenViewModel
{
private static Thread _currentThread;
public static void CloseSplash(Task task, TaskScheduler taskScheduler)
{
if (_view!= null)
{
// Here i need the right Task and to invoke the following method
// if I'm doing _view.Dispatcher.Invoke(new Action(_view.Close)); it doesn't
// work coz it's another STA Thread. Inside this class I can store the right task in
// a local variable. this works. But how to invoke it if the Task is already running?
// I like to overgive the task - may it isn't possible.
_view.Close();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/592 ... nning-task
Как вызвать метод для конкретной запущенной задачи ⇐ C#
Место общения программистов C#
-
Anonymous
1714492061
Anonymous
Я новичок в задачах тем.
Как получить доступ к нужной задаче и вызвать метод для этой задачи? У задачи есть идентификатор, я дал ей имя и получил TaskScheduler.
Я получаю правильное исключение:
InvalidOperationException: вызывающий поток не может получить доступ к этому объекту, поскольку объект принадлежит другому потоку.
В Main я запускаю Задача с CustomSplashScreenViewModel.StartSplashScreenAsync(). Другие задачи запускаются и выполняются. При событии, когда все загрузилось, мне нужно закрыть SplashScreen.
Метод CustomSplashScreenViewModel.CloseSplash(_splashTask, _taskSchedulerSplash); получает эту информацию. Когда я его отлаживаю, _splashTask имеет значение «null», а в _taskSchedulerSplash он содержит _splashTask внутри.
Внутри метода CloseSplash мне нравится чтобы вызвать метод _view.Close() в _splashTask.
Как это решить?
public class Program
{
private static readonly SingleThreadTaskScheduler _taskSchedulerSplash = new SingleThreadTaskScheduler(ApartmentState.STA);
[ThreadStatic]
private static Task _splashTask;
// [STAThread]
public static async Task Main()
{
_splashTask = await Task.Factory.StartNew(() =>
{
return CustomSplashScreenViewModel.StartSplashScreenAsync();
}, _taskSchedulerSplash);
var taskScheduler = new SingleThreadTaskScheduler(ApartmentState.STA);
var taskList = new List();
var updateTask = Task.Run(InstallHelper.CheckForUpdatesAsync);
updateTask.Wait();
taskList.Add(updateTask);
var tasks = await Task.Factory.ContinueWhenAll(taskList.ToArray(), result => Task.Factory.StartNew( ()=>AppStart(container), taskScheduler));
tasks.Wait();
}
private static void App_MainWindowLoaded(object sender, EventArgs e)
{
CustomSplashScreenViewModel.CloseSplash(_splashTask, _taskSchedulerSplash);
}
}
public class CustomSplashScreenViewModel
{
private static Thread _currentThread;
public static void CloseSplash(Task task, TaskScheduler taskScheduler)
{
if (_view!= null)
{
// Here i need the right Task and to invoke the following method
// if I'm doing _view.Dispatcher.Invoke(new Action(_view.Close)); it doesn't
// work coz it's another STA Thread. Inside this class I can store the right task in
// a local variable. this works. But how to invoke it if the Task is already running?
// I like to overgive the task - may it isn't possible.
_view.Close();
}
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/59211340/how-to-invoke-a-method-on-specific-running-task[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия