我有以下问题:
我想检查(C#)线程是否已完成执行,即线程方法是否已返回.我现在所做的就是打电话Thread.Join(1)
,但这会延迟1毫秒.有没有办法简单地检查线程是否已完成.检查Thread.ThreadState
似乎太麻烦了.
此链接中解释了.NET框架中的线程状态.
我最近在一个网站上看到了这张照片,我想到了几个问题:
OS中的线程生命周期与.NET框架中的线程生命周期不完全一致.有人可以提供与.NET框架中的操作系统状态相匹配的资源吗?
我们在.NET框架中没有名为Blocked的状态.如果发出I/O请求,线程的状态是什么?
Aborted州的目的是什么?当一个线程调用该Abort()
方法时,它将进入AbortRequested状态,并在线程响应中止请求后,它将进入Stopped状态.那么Aborted状态的功能是什么?
我用来检查线程的状态if(Thread.IsAlive)
.表单正在此线程中运行.在执行期间,即使表单保持打开,对Thread.IsAlive的调用似乎也在评估为false.我想要用同样的检查if(Thread.ThreadState==ThreadState.Running)
.这是正确的方法吗?如果没有,可能的工作是什么?
我正在阅读关于async/await
关键字的内容,我读到了:
当逻辑流到达等待令牌时,调用线程将暂停,直到调用完成.
好吧,我创建了一个简单的windows forms application
,放置了两个标签,一个按钮和一个文本框,我编写了代码:
private async void button1_Click(object sender, EventArgs e)
{
label1.Text = Thread.CurrentThread.ThreadState.ToString();
button1.Text = await DoWork();
label2.Text = Thread.CurrentThread.ThreadState.ToString();
}
private Task<string> DoWork()
{
return Task.Run(() => {
Thread.Sleep(10000);
return "done with work";
});
}
Run Code Online (Sandbox Code Playgroud)
我不明白的是,当我点击按钮时,label1将有文本Running
,标签将在10秒后只有相同的文字,但在这10秒钟内,我能够在文本框中输入文字,所以看来主线程正在运行......
那么,async/await是如何工作的呢?
问候
我有一个脚本运行一批非常相似的查询。
所有这些,除了一个,运行没有任何问题。
只有一个查询卡住了。
在“show processlist”中,查询有 state=null
根据文档,show processlist 应该只为“show processlist”线程本身报告“State=null”。
Server version: 5.0.67 MySQL Community Server (GPL)
mysql> show processlist;
+---------+--------+-----------+--------------+---------+------+-------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+--------+-----------+--------------+---------+------+-------+------------------------------------------------------------------------------------------------------+
| 3866613 | user | localhost | db_name | Query | 1986 | NULL | select log_time,log_action,log_action_id,log_object_id, @abcde:=if(log_action='abcde',to_ |
| 3873414 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+---------+--------+-----------+--------------+---------+------+-------+------------------------------------------------------------------------------------------------------+
2 rows in …
Run Code Online (Sandbox Code Playgroud) 我正在观察一个程序,想要杀死它,如果它在状态"等待:执行"一段时间.
以下是Process Explorer的屏幕截图:
我如何通过代码获得该状态?或者也许可以告诉我某个国家究竟意味着什么?这可以帮助我找到正确的查询来解决我的问题.
我有一个应用程序的threaddump,显示3个线程如下.
===============
"http-443-11" daemon prio=10 tid=0x00000000473bc800 nid=0x3590 waiting on condition [0x0000000061818000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007612a3880> (a java.util.concurrent.Semaphore$NonfairSync)
"http-443-4" daemon prio=10 tid=0x00000000451f6000 nid=0x243a waiting on condition [0x0000000055354000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007612a3880> (a java.util.concurrent.Semaphore$NonfairSync)
"http-443-7" daemon prio=10 tid=0x000000004602e000 nid=0x2974 waiting on condition [0x000000005e6e7000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000007612a3880> (a java.util.concurrent.Semaphore$NonfairSync)
Run Code Online (Sandbox Code Playgroud)
===============
"等待条件[]"有什么意义?[]中的数字有什么意义?
我正在Android Studio中学习该工具,获取线程转储,如下所示:
我注意到每个线程的状态都不同,
我可以看到有runnable
,sleeping
,waiting
。我深入线程堆栈,大多数这样的线程堆栈,
"<61> RxComputationScheduler-3@830064517520" daemon prio=5 waiting
java.lang.Thread.State: WAITING
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:157)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2017)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1050)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
我很困惑,他们这样做都停止Object.wait
,但线程的状态可以是runnable
,sleeping
,waiting
?
这是另一个状态线程的堆栈。
RUNNABLE
<53> RxSchedulerPurge-1@830057651944" daemon prio=5 runnable
java.lang.Thread.State: RUNNABLE
at java.lang.Object.wait(Object.java:-1)
at java.lang.Thread.parkFor(Thread.java:1205)
at sun.misc.Unsafe.park(Unsafe.java:325)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:197)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2056)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1062)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:778)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1035)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1097)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)</code>
Run Code Online (Sandbox Code Playgroud)
TIMED_WAITING …
我试图确定IO操作完成时切换线程的大致时间延迟(Win 7,Vista,XP).
我(我想)知道的是:
a)线程上下文切换本身在计算上非常快.(通过速度非常快,我的意思是通常的方式下1毫秒,甚至在1us的-假设一个比较快,卸载机等)
b)循环时间片量子大约为10-15ms.
我似乎无法找到的信息是关于(高优先级)线程变为活动/信号的典型延迟时间 - 例如,通过同步磁盘写入完成 - 并且该线程实际上再次运行.
例如,我至少读过一个地方,所有非活动线程都保持睡眠状态,直到~10ms系统量程到期,然后(假设它们已准备就绪),它们几乎同步地重新激活.但在另一个地方,我读到线程完成I/O操作与激活/发信号并再次运行之间的延迟是以微秒为单位,而不是毫秒.
我的询问背景与从高速摄像机捕获和连续流写入SSD阵列的SSD有关,除非我可以在先前的写入完成后在1ms以内完成新的写入(如果在平均1/10ms),这将是有问题的.
任何有关此问题的信息都将非常受欢迎.
谢谢,大卫
thread-state ×10
c# ×4
java ×3
thread-dump ×2
.net ×1
android ×1
async-await ×1
c ×1
c++ ×1
java-threads ×1
mysql ×1
performance ×1
processlist ×1
winapi ×1
windows ×1