如何在C#中识别创建当前方法所在线程的方法?

3
我希望能够确定创建当前方法所在线程的方法。我本来想用new StackFrame(int).GetMethod().Name实现,但是这个方法无法应用到当前线程。下面是我的代码示例:
private void doSomething(object sender, EventArgs e)
{
    try
    {
        Thread thread = new Thread(new ParameterizedThreadStart(GenerateThreadMethod));
        thread.Start(new Dictionary<String, Object>() {
            { "date" , Convert.ToDateTime(monthCalendar.SelectionRange.Start)},
            { "path", myList[myListBox.SelectedIndex][1] }
        });
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}


private void GenerateThreadMethod(Object obj)
{
    Dictionary<String, Object> data = (Dictionary<String, Object>)obj;

    DateTime date = (DateTime)data["date"];
    String path = (String)data["path"];

    //I want to find the name of doSomething() right here

    doMoreThings(date, path);
}
3个回答

4

目前没有内置的方法来实现此功能。但是,你可以将任意对象传递给ParametrizedThreadStart委托,其中包括您想要通信的所有信息,包括调用方法名称。


虽然其他答案也很好,但我会选择这个。我也重新考虑了在代码之外“传递”信息的想法。我认为这是该程序未来发展最安全的方式。 - Joshua Schlichting

2

无法识别父线程。

我看到另一个建议是尝试在新线程的名称前加上来自父线程的线程ID,并创建一个需要父级线程ID的构造器以生成所需的方法。

然后,您可以使用此信息来至少访问父线程,然后从那里开始,但我不确定是否足够接近您希望实现的目标。


1
我认为没有办法访问它,因为您的新线程有自己的上下文。我建议在创建线程时传递调用者的名称。
因此,在调用程序中,您将编写
StackTrace st = new StackTrace ();
StackFrame sf = st.GetFrame (0);

MethodBase currentMethodName = sf.GetMethod ();

将结果作为调用的参数传递给你的新线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接