【问题标题】:Whats actually join() method is doing in Thread?Thread 中的 join() 方法实际上在做什么?
【发布时间】:2019-04-22 09:10:51
【问题描述】:

我对 Thread 中的 join() 有疑问。我想在 Thread 中获得一个会话,所以我在我的单个线程中使用它。我第一次使用它时没有加入(),不幸的是我第一次获得会话值。但是在使用 Join() 之后它工作正常。 join 在一个线程中做什么。这是我尝试过的代码

public string ImportData(string entity, DataTable excelData, string dataExchangeSelectedColum, string conString, string fnameWithoutGuid, string loginName)
        {

            try
            {
                Guid importID = Guid.NewGuid();
                HttpContext ctx = HttpContext.Current;
                Thread thread = new Thread(() => { HttpContext.Current = ctx; ImportInThread(importID, entity, excelData, dataExchangeSelectedColum, conString, fnameWithoutGuid, loginName); });
                thread.Start();
                thread.Join();
                return importID.ToString();
            }
            catch (Exception)
            {

                throw;
            }


        }

【问题讨论】:

  • ImportData 方法也在线程上吗?
  • @AvinashReddy 在线程中没有一个名为ImportInThread的函数

标签: c# multithreading httpcontext


【解决方案1】:

仅供参考:任何真正的程序都不应该这样做:

Thread t = new Thread(() => { doStuff(); });
t.Start();
t.Join();

在调用Start() 之后立即调用Join() 会破坏创建新线程的目的。与创建新线程不同,程序此时可以简单地调用doStuff()


当你想这样做时创建一个新线程:

Thread t = new Thread(() => { doStuff(); });
t.Start();
doOTHERStuff();
t.Join();

现在,“Stuff”和“OTHERStuff”同时发生,这就是线程的全部目的。

【讨论】:

    【解决方案2】:

    Thread.Join() 阻塞调用线程,直到您调用 Join 的线程完成。
    在你的情况下,它会等到你在线程中的代码完成然后返回importID的值:

    Thread thread = new Thread(() => { HttpContext.Current = ctx; ImportInThread(importID, entity, excelData, dataExchangeSelectedColum, conString, fnameWithoutGuid, loginName); });
    

    如果您不使用thread.Join(),那么您只是开始并忘记了线程。
    这意味着您在不知道线程是否完成的情况下退出该方法,并且您可能需要它在返回之前完成。

    欲了解更多信息:https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.join?view=netframework-4.8

    【讨论】:

    • 所以如果我们使用单线程,是否需要加入线程?
    • @DhanilDinesan - 不,不是。
    • 好的,那么为什么只有在我不使用 Join() 时才第一次获取会话?
    • @DhanilDinesan HttpContext 只能在请求处理结束之前使用。如果你不调用Thread.Join,那么你会立即返回,结束请求的处理,让你的后台线程没有机会访问HttpContext。如果你想访问会话,你需要确保在结束请求之前这样做
    • 那么如果我们在线程中使用这个Thread.Join,会有什么性能问题吗?因为我使用 Thread 导入 excel 和发送多封邮件等
    猜你喜欢
    • 2014-09-10
    • 2015-05-27
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2020-12-05
    相关资源
    最近更新 更多