Как вызвать метод для конкретной запущенной задачиC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как вызвать метод для конкретной запущенной задачи

Сообщение 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();
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/592 ... nning-task
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»