Что на самом деле метод join () делает в Tread? - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть сомнения по поводу join () в теме.Я хочу получить сеанс в потоке, поэтому я использовал его в своем отдельном потоке.В первый раз я использовал его без join (), к сожалению, только в первый раз я получаю значение сеанса.Но после использования 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;
            }


        }

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

К вашему сведению: нет реальная программа должна когда-либо делать это:

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

Вызов Join() сразу после вызова Start() отменяет цель создания нового потока. Вместо создания нового потока программа могла бы просто вызвать doStuff() в этот момент.


Создайте новую тему, когда вы хотите сделать это:

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

Теперь у вас есть "Stuff" и "OTHERStuff", которые происходят одновременно, что и является целью потоков.

1 голос
/ 22 апреля 2019

Thread.Join() блокирует вызывающую нить до тех пор, пока нить, которую вы называли Join on, не будет завершена.
В вашем случае он будет ждать, пока ваш код внутри потока не будет завершен, а затем вернет значение 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

...