2011-07-22 89 views
2

我在主線程中有一個「字符串」和一個「StreamReader」。我想將這些傳遞給一個將讀取streamreader到字符串中的線程。我想要在主線程中更改字符串。我的問題是我該如何做到這一點?從被調用線程獲取信息回主線程?

附加信息:我有特定的原因,爲什麼我想要線程,所以請只堅持規格。另外,我不能使用TPL,因爲我無法獲得框架4.0 ...再次出於具體原因。

回答

7

因此,您使用stringStreamReader屬性進行授課。您使用ParameterizedThreadStart將該類的一個實例傳遞給其他線程。你有另一個線程通過寫入該類的該實例的string屬性來填充該毛茛。

當線程完成後,您的類實例上的string屬性將被填滿。好極了。

因此,像

class Foo { 
    public string Bar { get; set; } 
} 

然後:

Foo foo = new Foo(); 
var thread = new Thread(o => { Foo f = (Foo)o; f.Bar = "FillMeUpButterCup"; }); 
thread.Start(foo); 
thread.Join(); 
Console.WriteLine(foo); 

哇!

我離開StreamReader但現在你明白了。

1

創建線程時,您有ParameterizedThreadStart委託和一個可以傳遞給它的參數。只需創建一個具有兩個屬性的類 - stringStreamReader(可能還有其他任何您想要傳遞的屬性),並將該類的實例傳遞給線程啓動方法。

public class ThreadStartParam 
{ 
    public string Str { get; set; } 
    public StreamReader StreamReader { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var t = new Thread(YourMethod); 

     var param = new ThreadStartParam(); 
     param.Str = "abc"; 
     param.StreamReader = new StreamReader(); 

     t.Start(param); 
    } 

    static void YourMethod(object param) 
    { 
     var p = (ThreadStartParam) param; 
     // whatever 
    } 
} 
0

我寫了一篇博客文章這一段去年,我認爲它會涉及如何正確地傳達給線程和線程回來。基本上創建一個傳入和傳出線程的對象,您可以使用ParameterizedThreadStart傳遞給線程,並且您可以通過委託來傳回。

http://coreyogburn.com/post/Threads-Doing-Them-Right-wGUI.aspx

在你的主線程中實現改變的字符串,你傳遞給線程的例子更具體,我建議上線後,您調用將字符串值恢復的方法和重新設置原始字符串的值。這將阻止線程添加到字符串,而主線程可能會嘗試讀取它。