2016-03-11 2 views
-1

Я занимаюсь многозадачностью и пробовал этот код, но он не работает, как я ожидал.Почему этот код не возвращает ожидаемый результат?

Я ожидал, что workTask начнет первую печать «работать ...» по всему циклу, затем продолжит работу с newTask и напечатает «moreWorkThread: working ...» в течение всего цикла. Сначала я подумал, что «workThread: Done» будет напечатан в конце, но затем я понял из вывода, что он может работать в любое время между другими.

Я вообще не понимаю остальное поведение.
newTask не запускается вообще, и цикл в someWork никогда не завершается.

Может кто-нибудь, пожалуйста, объясните мне это? Я хочу знать, почему этот код ведет себя так, что и модов я могу сделать, чтобы дать ожидаемой выходной

  • запустить someWork
  • завершения цикла
  • ContinueWith moreWork
  • полный цикл. Выход

    public static void Main() { 
        Task workTask = new Task(someWork); 
        workTask.Start(); 
    
        Console.WriteLine("WorkThread: Done!"); 
    
        Task newTask = workTask.ContinueWith(moreWork); 
    
    } 
    
    static public void someWork() 
    { 
        for(int i = 0; i < 16; i++) 
        { 
         Console.WriteLine("WorkThread: working..."); 
        } 
    } 
    static public void moreWork(Task task) 
    { 
        for(int i = 0; i < 8; i++) 
        { 
         Console.WriteLine("moreWorkThread: working..."); 
        } 
    } 
    

образец:

WorkThread: Готово!

WorkThread: работа ...

WorkThread: работа ...

+6

Добро пожаловать в Переполнение стека. К сожалению, вы не сказали нам, что вы ожидали или что видели, что очень затрудняет «объяснить» что угодно ... но вы включили (почти) полную программу, что является хорошим началом. Просто уточните, что вы ожидали, и я уверен, что мы сможем помочь. –

+0

извините ... редактирование сейчас .... –

+0

Следует отметить, что основной поток не дожидается, когда потоки потоков будут завершены до их существования. Это означает, что приложение прекратится до того, как что-нибудь полезное произойдет. Попробуйте положить Console.ReadLine в конце метода 'main'. –

ответ

1
var task = Task.Run(() => 
     { 
      someWork(); 
     }); 
     await task; 

     Console.WriteLine("WorkThread: Done!"); 
     await task.ContinueWith((t) => {morework() }); 

лучше использовать асинхр ждать. Ожидание будет ждать, пока что-то закончится, прежде чем вы скажете «сделано».

+0

ваш подход кажется намного лучше ... но в чем разница между task.Run() и task.Start()? –

+0

Я думаю, что вы уже знаете ответ, но немного объясните, Задача.Запустите только очередь задач в threadpool, и процессор решит, когда он выполнит задачу, поставленную в очередь. Task.Start() заставит вашу задачу выполнить. – Jay

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