c#中的线程是否适用于其他方法?

时间:2016-05-18 13:42:26

标签: c# multithreading

问题

我正在将我的相机流出来,并希望它在一个单独的线程上运行,因为我的UI正在冻结。如果我在第一个方法调用上启动一个Thread,那么该方法中的方法是进入新线程还是旧线程?

这是我目前的设置。

代码

当用户点击“开始流式”

Thread thread = new Thread(new ThreadStart(StartNewStream));
thread.Name = "streammm";
thread.Start();

这会调用' StartNewStream'调用其他方法的方法:

cam.OnSampleAvailable += (s, e) =>
{
    lock (BusyLock)
      rtspRecord.PushVideo(e.Sample);
};

win.OnSamplesAvailable += (s, e) =>
{
    lock (BusyLock)
       rtspRecord.PushAudio(e.Samples);
};

在UI线程或新创建的线程中调用PushVideo和PushAudio方法吗?

如果我进入PushVideo方法并输入代码:

Thread TR = Thread.CurrentThread;
string _name = TR.name;

名称现在为空?

任何人都对我做错了什么有所帮助?

2 个答案:

答案 0 :(得分:3)

无论哪个线程调用OnSampleAvailable事件或委托,也会执行其处理程序。哪个线程分配处理程序无关紧要。

您必须了解您的代码实际执行的操作:

cam.OnSampleAvailable += (s, e) =>
{
    lock (BusyLock)
        rtspRecord.PushVideo(e.Sample);
};

这首先不会调用任何东西。它只将匿名方法(s, e) => { ... }指定为事件cam.OnSampleAvailable的处理程序。

这里不调用处理程序。分配完成后,当您的StartNewStream方法结束时,您的新主题结束。然后,很久以后,您的相机上可能会有样品。无论哪个线程负责(我们不知道)将调用cam.OnSampleAvailable事件,并且处理程序(您之前分配的匿名方法(s, e) => { ... })将由该未知线程执行

答案 1 :(得分:0)

这取决于camwin的实施情况。 Likey这两个事件是在他们自己的线程池线程上运行还是可以在UI线程上运行,如果它们以知道如何捕获OperationContext的方式编写