Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 试图用实际执行的内容解释(VS2008)线程窗口_C#_.net_Visual Studio_Multithreading_Asynchronous - Fatal编程技术网

C# 试图用实际执行的内容解释(VS2008)线程窗口

C# 试图用实际执行的内容解释(VS2008)线程窗口,c#,.net,visual-studio,multithreading,asynchronous,C#,.net,Visual Studio,Multithreading,Asynchronous,我是多线程新手,我一直在进行概念验证,我还“发现”了(VS2008)线程窗口: 我的问题是:如何将正在运行的线程“链接”到我的代码? 例如,如何获取线程ID(如Threads窗口中所示),以便记录它(例如)或,BeginInvoke()方法接受我设置的“id”参数(字符串)(在下面的示例中为“服务a”),但我在Threads窗口中看不到它 我感兴趣的是,我使用AsyncCallbacks和BeginInvoke()启动了三个并行执行线程,但在threads窗口中我只能看到两个工作线程,而我认为

我是多线程新手,我一直在进行概念验证,我还“发现”了(VS2008)线程窗口:

我的问题是:如何将正在运行的线程“链接”到我的代码? 例如,如何获取线程ID(如Threads窗口中所示),以便记录它(例如),BeginInvoke()方法接受我设置的“id”参数(字符串)(在下面的示例中为“服务a”),但我在Threads窗口中看不到它

我感兴趣的是,我使用AsyncCallbacks和BeginInvoke()启动了三个并行执行线程,但在threads窗口中我只能看到两个工作线程,而我认为应该看到三个。事实上,我认为我可以-三个工作线程的“名称”为

以下是我使用的一些代码供参考:

// Creating the call back and setting the call back delegate
AsyncCallback callBackA = new AsyncCallback(AsyncOperationACompleted);
// callBackB ...
// callBackC ...

// Create instances of the delegate, which calls the method we want to execute
callerA = new DumbEndPoint.AsyncMethodCaller(DumbEndPoint.PretendWorkingServiceCall);
// callerB ...
// callerC ...

// sleep = thread sleep time in milliseconds
IAsyncResult resultA = callerA.BeginInvoke(sleep, "Service A", callBackA, null);
// resultB ...
// resultC ...

// I expect to see three threads in the Threads Window at this point.
然后,我将在回拨代理中获得结果:

    private void AsyncOperationACompleted(IAsyncResult result)
    {
        try
        {               
            string returnValue = callerA.EndInvoke(result);
            mySmartDTO.ServiceDataA = returnValue;
        }
        catch (Exception ex)
        {
            // logging
            ...
        }
    }

您可以使用Thread.Name来设置线程的名称。设置名称后,它将出现在“线程”窗口的“名称”列中

e、 例如,假设
服务A
是您希望出现在Threads窗口的name列中的名称,您可以在
假装工作服务调用中执行类似操作:

void PretendWorkingServiceCall(int sleepMilliseconds, string name)
{
    System.Threading.Thread.CurrentThread.Name = name;

    // your code goes here
}

是的,我有点傻。我刚刚意识到,在玩了更多的游戏之后:)有一件事,Thread.CurrentThread.ManagedThreadId返回了一个完全不同的id。@Adrian K:对于非托管线程id(您在Threads窗口中看到的),请参阅
AppDomain.GetCurrentThreadId()
。但是,可能存在托管线程ID与非托管线程ID不是一对一的情况。如果使用此方法,您将得到的文档和编译器警告将进一步解释详细信息。