2013-03-13 36 views
0

如果我使用TPL我遇到問題Parse ..方法我使用Console.Write來建立一些線,但有時一個是快速和寫入其他方法行。我如何鎖定或有更好的方法?TPL與多個方法調用Console.Write問題

Parallel.Invoke(
() => insertedOne = Lib.ParseOne(list), 
() => insertedTwo = Lib.ParseTwo(list), 
() => insertedThree = Lib.ParseThree(list)); 

解析..方法示例。

public static int ParseOne(string[] _list) { 
    Console.Write("blabla"); 
    Console.Write("blabla"); 
    return 0; 
} 
public static int ParseTwo(string[] _list) { 
    Console.Write("hahahah"); 
    Console.Write("hahahah"); 
    return 0; 
} 
public static int ParseThree(string[] _list) { 
    Console.Write("egegege"); 
    Console.Write("egegege"); 
    return 0; 
} 
+0

您沒有提供足夠的信息。什麼是'Lib',什麼是'ParseOne','ParseTwo'和'ParseThree'。他們的簽名是什麼?你在用什麼語境?您當前的產出與您的預期產出是什麼? – 2013-03-13 21:44:14

+0

如果多個線程共享資源,那麼如果要控制結果,則需要採用某種同步。在這種情況下,控制檯是共享資源。 – 2013-03-13 21:50:13

回答

2

爲了能夠打印blabla S,hahahah S和egegege S作爲一個單一的實體(不可分割) ,你可以寫你的方法:

public static int ParseThree(string[] _list) 
{ 
    lock (Console.Out) 
    { 
     Console.Write("egegege"); 
     Console.Write("egegege"); 
    } 
    return 0; 
} 
+0

是的,謝謝多數民衆贊成它! – Mikatsu 2013-03-13 22:19:21

1

爲什麼不在一個線程中一個接一個地運行所有任務?

System.Threading.Tasks.Task.Factory.StartNew(()=> 
{ 
    insertedOne = Lib.ParseOne(list); 
    insertedTwo = Lib.ParseTwo(list); 
    insertedThree = Lib.ParseThree(list); 
}); 

這樣你不會有太大的比賽條件。

+0

'爲什麼不在一個線程中一個接一個地執行所有任務?'也許'Lib.ParseXXX是昂貴的操作,OP想要並行執行它們。 – I4V 2013-03-13 21:50:38

+0

您啓動一個執行順序性方法的任務,並且不會等待它們完成。不接近OP試圖實現的目標。 – I4V 2013-03-13 21:59:25

+0

Mhmmm使用我所看到的,您可以始終啓動三個獨立的任務並調用任務(n-1).Wait()在返回任務結果之前? – Heinrich 2013-03-13 21:59:38