How to name a thread running a Task?

2020-03-01 05:28发布

I find naming threads to be very useful when debugging.

I can see no way to name a thread using arguments to Task.Factory.StartNew()

So is it acceptable to name the thread explicitly in the task? eg:

private void MyFunc()
{
    Task.Factory.StartNew(() =>
    {
        Thread.CurrentThread.Name = "Foobulizer";
        Foobulize();
    });
}

However, I appreciate that threads may be reused for different tasks, so would I need to explicitly reset the thread name at the end of the task? This feels pretty hacky so I'm thinking this is probably a bad idea, or there's a proper way to do it?

3条回答
家丑人穷心不美
2楼-- · 2020-03-01 05:48

The default TaskScheduler uses the .NET ThreadPool to schedule the tasks. So you will get a thread that already exists or one that will be reused (both potentially, but likely).

Note that you can only name a thread once. The second attempt to call Thread.CurrentThread.Name will raise an InvalidOperationException. This is particularly bad when it is a thread pool thread.

In general you should not change attributes of a thread that you did not (explicitly) create or own (the name being one, the priority being the other prominent candidates).

查看更多
放我归山
3楼-- · 2020-03-01 05:57

Sure you can, just remove the Name again when you're done. set the thread Name again to "Idle" ore string.Empty after Foobulize();

查看更多
Luminary・发光体
4楼-- · 2020-03-01 05:59

You can not do this since multiple Tasks can share single or multiple threads depends on ThreadPool state in a given moment of time. Basically Task is not a Thread this is just a high level abstraction for the asynchronous operation. You can use Task.Id property but keep in mind that Id is readonly and of int type so you can't assign custom user-friendly name.

Task IDs are assigned on-demand and do not necessarily represent the order in the which Task instances were created

Take a look at the built in Visual Studio 2010 Parallel Debugging features, perhaps you'll find an other approach: Walkthrough: Debugging a Parallel Application

Parallel Tasks Window:

enter image description here

For each running Task, you can read its ID, which is returned by the same-named property, the ID and name of the thread that runs it, its location (hovering over that displays a tooltip that has the whole call stack). Also, under the Task column, you can see the method that was passed into the task; in other words, the starting point

查看更多
登录 后发表回答