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

时间:2017-01-19 13:36:13

标签: c# multithreading methods

我正在寻找创建当前方法运行的Thread的方法。

我会使用新的StackFrame(int)。GetMethod()。名称,但是我在运行它时遇到了一个新线程,所以这个已经出来了。

我的代码示例如下:

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 个答案:

答案 0 :(得分:4)

没有内置方法可以做到这一点。但是,您可以将任意对象传递给您的ParametrizedThreadStart委托,该委托可以包括您要传达的任何信息,包括调用方法名称。

答案 1 :(得分:2)

您无法识别父线程。

我已经看到另一个建议您可以尝试使用来自父线程的线程ID为新线程的名称添加前缀,然后在要生成的方法上创建一个构造函数,该构造函数需要来自父线程的线程ID。

然后你可以使用这些信息来至少获得对父线程的访问权限,并从那里开始,但我不确定这是否会让你足够接近你希望实现的目标。

答案 2 :(得分:1)

我不认为有一种方法可以访问它,因为你的新主题拥有它自己的上下文。我宁愿建议在创建线程时传递调用者的名字。

所以在调用者中你会写

StackTrace st = new StackTrace ();
StackFrame sf = st.GetFrame (0);

MethodBase currentMethodName = sf.GetMethod ();

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