C# 控制台.写线(“);卡住
有时,当我执行上述语句时,程序在控制台应用程序中冻结。如果我断了,我就无法移动到下一行。我需要重置缓冲区还是什么 它是一个批处理应用程序,可在屏幕上显示消息。是否有人经历过这种情况并设法解决了它。这似乎是一件新鲜事。我正在使用Visual Studio 2017 Prof.editionC# 控制台.写线(“);卡住,c#,visual-studio-2017,C#,Visual Studio 2017,有时,当我执行上述语句时,程序在控制台应用程序中冻结。如果我断了,我就无法移动到下一行。我需要重置缓冲区还是什么 它是一个批处理应用程序,可在屏幕上显示消息。是否有人经历过这种情况并设法解决了它。这似乎是一件新鲜事。我正在使用Visual Studio 2017 Prof.edition WriteLine暂停的功能如下所示。sMessage的值为空“” 它也碰巧是,甚至有时当我调试代码时,它也没有启动(只是冻结)。有时我需要停止执行并重新调试代码。我删除了visual studio并重新安装,
WriteLine
暂停的功能如下所示。sMessage
的值为空“”
它也碰巧是,甚至有时当我调试代码时,它也没有启动(只是冻结)。有时我需要停止执行并重新调试代码。我删除了visual studio并重新安装,现在一切正常。我建议您也这样做。可能导致这种情况的一个原因是,如果您单击控制台窗口,它会开始选择文本,换句话说,这是从控制台窗口复制文本的第一步。发生这种情况时,对控制台窗口的写入将挂起,直到您返回控制台窗口并按Enter键删除选择框。使用
System.Threading.Tasks.Dataflow
nuget软件包,当用户在控制台窗口上选择文本时,您可以使用缓冲区帮助不锁定应用程序
private static BufferBlock<string> _buffer = new BufferBlock<string>();
private static Task _consumer;
private static CancellationTokenSource _cts;
public static void Main(string[] args)
{
_buffer = new BufferBlock<string>();
_cts = new CancellationTokenSource();
_consumer = ConsumeAsync(_buffer, _cts.Token);
for (int i = 0; i < 100000; i++)
{
WriteToConsole(i.ToString());
}
Console.ReadLine();
}
private static void WriteToConsole(string message)
{
SendToBuffer(_buffer, message);
}
private static void SendToBuffer(ITargetBlock<string> target, string message)
{
target.Post(message);
}
private static async Task ConsumeAsync(IReceivableSourceBlock<string> source, CancellationToken cancellationToken)
{
while (await source.OutputAvailableAsync(cancellationToken))
{
var message = await source.ReceiveAsync();
Console.WriteLine(message);
}
}
private static BufferBlock_buffer=new BufferBlock();
私有静态任务_消费者;
私有静态取消令牌源;
公共静态void Main(字符串[]args)
{
_buffer=新的BufferBlock();
_cts=新的CancellationTokenSource();
_consumer=consumerasync(_buffer,_cts.Token);
对于(int i=0;i<100000;i++)
{
WriteToConsole(i.ToString());
}
Console.ReadLine();
}
私有静态void writeConsole(字符串消息)
{
SendToBuffer(_缓冲区,消息);
}
私有静态void SendToBuffer(ITargetBlock目标,字符串消息)
{
target.Post(消息);
}
专用静态异步任务ConsumeSync(IReceivableSourceBlock源,CancellationToken CancellationToken)
{
while(等待source.OutputAvailableAsync(cancellationToken))
{
var message=await source.ReceiveAsync();
控制台写入线(消息);
}
}
这意味着写入控制台根本不会阻塞,所以在很多情况下它可能没有用处。在我的例子中,我只需要吐出日志信息您没有显示任何代码,因此无法提供帮助。这绝不是偶然的:?不,不是那个问题,这是一个正在用C语言开发的控制台应用程序,在Visual Studio 2017中调试。它在标题的行上暂停。
“
不是正确的:P jk但无代码=无帮助,因为正常的writeline不会暂停application@EpicKip引用是因为这就是为什么如此呈现标题!您没有oFptr的,您确定代码中的某个地方有这样的对象,并且您的程序没有卡在oFptr的上吗?你试过分步调试吗?真遗憾,我希望这是某种缓冲问题,我可以刷新或做类似的事情。也许有另一种方法可以像你说的那样解决这个问题,但我发现重新安装visual Studio更容易这正是我的问题所在。讨论包含一个禁用文本选择和防止此类挂起的方法。遇到了相同的问题。这对我来说很奇怪。知道为什么吗?托尼,我知道这是个老问题,今天又发生了。我记得我的问题,并注意到它不会移动,说了一些关于线程。我的屏幕上没有选择文本的内容,所以我一直按enter键,选择和取消选择文本,最终它做出了响应。
private static BufferBlock<string> _buffer = new BufferBlock<string>();
private static Task _consumer;
private static CancellationTokenSource _cts;
public static void Main(string[] args)
{
_buffer = new BufferBlock<string>();
_cts = new CancellationTokenSource();
_consumer = ConsumeAsync(_buffer, _cts.Token);
for (int i = 0; i < 100000; i++)
{
WriteToConsole(i.ToString());
}
Console.ReadLine();
}
private static void WriteToConsole(string message)
{
SendToBuffer(_buffer, message);
}
private static void SendToBuffer(ITargetBlock<string> target, string message)
{
target.Post(message);
}
private static async Task ConsumeAsync(IReceivableSourceBlock<string> source, CancellationToken cancellationToken)
{
while (await source.OutputAvailableAsync(cancellationToken))
{
var message = await source.ReceiveAsync();
Console.WriteLine(message);
}
}