C# 这些事件回调将在哪个线程上发生?
第1部分:假设我在winforms应用程序的主UI线程上运行上述代码。对C# 这些事件回调将在哪个线程上发生?,c#,multithreading,visual-studio-2010,C#,Multithreading,Visual Studio 2010,第1部分:假设我在winforms应用程序的主UI线程上运行上述代码。对SomeMethod的调用将发生在哪个线程上?它们会出现在我创建对象时创建的同一线程上吗 第2部分:使用Visual Studio 2010,我如何自己解决这个问题?我不知道从哪里可以找到什么线程正在运行。事件处理程序SomeMethod将在引发事件的任何线程上运行 您可以在事件处理程序SomeMethod中设置断点,并查看(您可能希望为线程指定有意义的名称以查找它们)。要查找当前正在执行的线程,可以使用thread.Cur
SomeMethod
的调用将发生在哪个线程上?它们会出现在我创建对象时创建的同一线程上吗
第2部分:使用Visual Studio 2010,我如何自己解决这个问题?我不知道从哪里可以找到什么线程
正在运行。事件处理程序SomeMethod
将在引发事件的任何线程上运行
您可以在事件处理程序SomeMethod
中设置断点,并查看(您可能希望为线程指定有意义的名称以查找它们)。要查找当前正在执行的线程,可以使用thread.CurrentThread.ManagedThreadId
回答您的问题:SomeMethod将在引发事件的线程中执行
在您的情况下,当您将方法分配给事件时,它实际上永远不会执行,但永远不会实际引发事件。您可以检查ManagedThreadId属性
@迈克,这是样品
new System.Threading.Thread(() =>
{
var myObject = new CustomObject();
myObject.SomeEvent += SomeMethod;
}).Start();
只是想添加一个简单的测试,允许您检查处理程序执行的线程:
Console.WriteLine("Main New Thread : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
new System.Threading.Thread(() =>
{
Console.WriteLine("Inside New Thread : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
}).Start();
Console.WriteLine("Main New Thread : {0}", System.Threading.Thread.CurrentThread.ManagedThreadId);
其中打印:
class Test
{
delegate void update();
static event update updateEvent;
static void Main(string[] args)
{
Console.WriteLine("Parent thread: " + Thread.CurrentThread.ManagedThreadId);
updateEvent += new update(Test_updateEvent);
var t = new Thread(
() =>
{
Console.WriteLine("Child thread: " + Thread.CurrentThread.ManagedThreadId);
updateEvent();
});
t.Start();
t.Join();
}
static void Test_updateEvent()
{
Console.WriteLine("Event thread: " + Thread.CurrentThread.ManagedThreadId);
}
}
啊,我明白了。所以,如果我想确保SomeMethod
在一个新的线程上运行
,那么像这样做会被认为是好的实践吗<代码>新线程(()=>this.SomeEvent.Invoke(this,neweventargs()).Start()
当我想要实际引发事件时?@michael.mankus,如果您想要在单独的线程上运行事件,请使用BeginInvoke
/EndInvoke
方法或Tasks
而不是新建thread
对象。尽管事件通常不是这样完成的,但如果需要,通常是事件处理程序负责进行后台工作,否则可能会导致处理程序可重入。如果你真的想让你的事件在后台自动引发,请确保它有明确的文档记录。另外,请查看这本专门关于C#线程的电子书:我明白你的意思,如果需要,谁通常有责任做后台(线程化)工作。接下来,我将正常调用事件,如果需要,我将在处理程序中创建一个后台任务。有道理。这个答案已经由@Daniel提供了,因此没有增加任何价值。
Parent thread: 1
Child thread: 3
Event thread: 3