gpt4 book ai didi

c# - 了解 Thread/BeginInvoke? [初学者]

转载 作者:太空狗 更新时间:2023-10-29 17:50:05 27 4
gpt4 key购买 nike

考虑代码:

class Work
{
public void DoStuff(string s)
{
Console.WriteLine(s);
// .. whatever
}
}
class Master
{
private readonly Work work = new Work();

public void Execute()
{
string hello = "hello";

// (1) is this an ugly hack ?
var thread1 = new Thread(new ParameterizedThreadStart(o => this.work.DoStuff((string)o)));
thread1.Start(hello);
thread1.Join();

// (2) is this similar to the one above?
new Action<string>(s => this.work.DoStuff(s)).BeginInvoke(hello, null, null);
}
}

(1) 是一种可以在单独的线程中轻松开始某些工作的可接受方法吗?如果没有更好的选择,我们将不胜感激。

(2) 是不是也一样?我想我问的是是否启动了一个新线程,或者..

希望你能帮助初学者更好地理解:)

/莫伯格

最佳答案

(1) 不是一个丑陋的 hack,但它不是现在处理线程的“方式”。 Thread Pool线程来自 BeginInvoke/EndInvoke , BackgroundWorker Task Parallel Library在 .NET 4.0 中是要走的路。

(2) 很好,但是您需要配对您的 BeginInvokeEndInvoke某处。分配新的 Action<string>到一个变量,然后调用 x.EndInvoke()在您的主线程或完成方法中手动对其进行操作(BeginInvoke 的第二个参数)。参见 here作为一个不错的引用。

编辑:以下是 (2) 与 (1) 的合理等价方式:

    var thread2 = new Action<string>(this.work.DoStuff);
var result = thread2.BeginInvoke(hello, null, null);
thread2.EndInvoke(result);

关于c# - 了解 Thread/BeginInvoke? [初学者],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691846/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com