作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 C# 控制台应用程序中实现以下功能:
现在我正在使用 TPL,但我不知道如何将消息从工作线程发送到主线程。谢谢你的帮助!
最佳答案
您可以将生产者/消费者模式与 TPL 一起使用,如 this example on an MSDN blog 中所示。 .
或者,您可以采用老式方法并使用信号,请参阅 AutoResetEvent
.
或者,如果您希望在非常的级别上工作,请将 Monitor.Pulse
与 Monitor.WaitOne
一起使用(如 here 所示) ).
无论哪种方式,您都在寻找同步,您可以在 here 上阅读它.
其他选项,如果您实际上并不关心更新在哪个线程上运行,则可以将委托(delegate)作为参数并在那里打印更新,à la:
static Task<string> ReadFile(string filename, Action<string> updateStatus)
{
//do stuf synchronously
return Task<string>.Factory.StartNew(() => {
System.Threading.Thread.Sleep(1000);
//do async stuff
updateStatus("update message");
//do other stuff
return "The result";
});
}
public static void Main(string[] args)
{
var getStringTask = ReadFile("File.txt", (update) => {
Console.WriteLine(update)
});
Console.Writeline("Reading file...");
//do other stuff here
//getStringTask.Result will wait if not complete
Console.WriteLine("File contents: {0}", getStringTask.Result);
}
将打印:
Reading file...
update message
File contents: The result
“更新消息”
对 Console.WriteLine
的调用仍将发生在 ThreadPool
线程上,但它仍可能满足您的需要。
关于c# - 如何在 C# 中生成工作线程并在主线程中处理它们的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485304/
我是一名优秀的程序员,十分优秀!