在单线程控制台应用程序中,人们经常使用Thread.Sleep懒惰的方式暂停应用程序一段时间.
这个问题提出了一些关于不使用这种方法的有趣观点:为什么Thread.Sleep如此有害
然而,除了知道Sleep阻止当前线程之外,我不明白它是如何工作的 - 例如它是否在紧密循环中最大化CPU核心还是实际上暂停了线程?
对我来说更重要的是,控制台应用程序如何在睡眠中被捕获时响应各种应用程序退出方案(CTRL-C,kill,窗口关闭按钮)?是否会盲目地继续执行,直到操作系统强行杀死它,或者它会表现得好吗?
可能重复:
C#最简单的写入重试逻辑的方法?
我有一个功能包含服务器的Web服务调用,由于网络中的一些干扰,有时会失败(无法连接远程服务器错误).代码在try catch块中.我想在try块中重新运行Web服务调用,以便成功完成Web调用.
我有一些已经异步的代码 - 只是不使用Task系统.如果可能的话,我想使它成为一个轻量级的任务,以便代码可以将其用作任务.
所以我想接受这个:
void BeginThing(Action callback);
Run Code Online (Sandbox Code Playgroud)
并把它变成这个伪代码:
Task MyBeginThing() {
Task retval = // what do I do here?
BeginThing(() => retval.Done())
return retval;
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?我不想使用互斥锁和其他线程作为解决方案.
我的问题不仅适用于C#和Asp.net,但我更容易提出更具体的问题.
当Asp.net请求等待异步IO操作时,该线程基本上进入线程池以供其他请求重用.为什么这比直到IO操作完成之前休眠线程更有效?毕竟,当线程返回到线程池时,其堆栈需要保留在内存中以完成原始请求.我的假设是我们不能重用分配给线程的内存,除非我们在其他地方复制使用过的堆栈内存并且复制数据可能会引入额外的开销,这可能是不合理的.
我错过了什么吗?我的假设是错的吗?请解释.
编辑:jlew指出的答案缺少一点.当线程返回池时,请求使用的堆栈内存会发生什么?如果我们不能重用内存,那么重用线程有什么意义呢?如果我们想重用未使用的堆栈部分,那么我们将不得不移动一些内存.如果是这样,移动内存并重新使用未使用的堆栈内存可以提高整体效率吗?
我想在列表框中添加一些文本Task,我只需使用一个按钮并在点击事件中放置此代码:
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 10; i++)
{
listBox1.Items.Add("Number cities in problem = " + i.ToString());
System.Threading.Thread.Sleep(1000);
}
}, CancellationToken.None, TaskCreationOptions.None, uiScheduler);
Run Code Online (Sandbox Code Playgroud)
但是直到for循环结束它才能工作并且UI被锁定.
问题出在哪儿 ?
谢谢 :)
我想将按钮的背景颜色更改为几秒钟,然后将其更改为正常.由于某种原因,它根本无法工作,我必须等待那些秒,我测试的一些东西也可以工作,但backgroundcolor没有改变.这是我到目前为止所尝试的:
private void button1_Click(object sender, EventArgs e)
{
button1.BackColor = Color.Lime;
Thread.Sleep(2000);
button1.BackColor = SystemColors.Control;
}
Run Code Online (Sandbox Code Playgroud)
希望有人可以帮助我解决这个问题!
我尝试实现.NET Stopwatch以获得乐趣,但我得到了一些意想不到的结果.
我完全期待这个程序的执行时间大约为100毫秒.
是Stopwatch类不准确或这到底是怎么回事呢?
码:
namespace Timer
{
class Program
{
Stopwatch s = new Stopwatch();
static void Main(string[] args)
{
s.Start();
for (int i = 0; i < 100; i++)
{
Thread.Sleep(1);
}
s.Stop();
Console.WriteLine("Elapsed Time " + s.ElapsedMilliseconds + " ms");
Console.ReadKey();
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果是 190 ms
c# ×7
.net ×1
asp.net ×1
async-await ×1
asynchronous ×1
backcolor ×1
button ×1
c#-4.0 ×1
stopwatch ×1
task ×1
thread-sleep ×1