我在主線程中有一個「字符串」和一個「StreamReader」。我想將這些傳遞給一個將讀取streamreader到字符串中的線程。我想要在主線程中更改字符串。我的問題是我該如何做到這一點?從被調用線程獲取信息回主線程?
附加信息:我有特定的原因,爲什麼我想要線程,所以請只堅持規格。另外,我不能使用TPL,因爲我無法獲得框架4.0 ...再次出於具體原因。
我在主線程中有一個「字符串」和一個「StreamReader」。我想將這些傳遞給一個將讀取streamreader到字符串中的線程。我想要在主線程中更改字符串。我的問題是我該如何做到這一點?從被調用線程獲取信息回主線程?
附加信息:我有特定的原因,爲什麼我想要線程,所以請只堅持規格。另外,我不能使用TPL,因爲我無法獲得框架4.0 ...再次出於具體原因。
因此,您使用string
和StreamReader
屬性進行授課。您使用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
但現在你明白了。
創建線程時,您有ParameterizedThreadStart
委託和一個可以傳遞給它的參數。只需創建一個具有兩個屬性的類 - string
和StreamReader
(可能還有其他任何您想要傳遞的屬性),並將該類的實例傳遞給線程啓動方法。
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
}
}
我寫了一篇博客文章這一段去年,我認爲它會涉及如何正確地傳達給線程和線程回來。基本上創建一個傳入和傳出線程的對象,您可以使用ParameterizedThreadStart傳遞給線程,並且您可以通過委託來傳回。
http://coreyogburn.com/post/Threads-Doing-Them-Right-wGUI.aspx
在你的主線程中實現改變的字符串,你傳遞給線程的例子更具體,我建議上線後,您調用將字符串值恢復的方法和重新設置原始字符串的值。這將阻止線程添加到字符串,而主線程可能會嘗試讀取它。