Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Доступ к HttpContext.Current из дочернего потока / 18 сообщений из 18, страница 1 из 1
05.01.2016, 19:02
    #39142480
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Привет.
Как организовать доступ к HttpContext.Current из дочернего потока?
Можно передавать его параметром в Task, например, но есть ли способы получше?
Хотелось бы, чтоб контекст был доступен без необходимости вспоминать, что его нужно добавить параметром.
Спасибо.
...
Рейтинг: 0 / 0
05.01.2016, 20:48
    #39142509
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
HttpContext.Current устанавливается при продолжении (await, Task.ContinueWith) через контекст синхронизации AspNet. Во всех остальных случаях его нужно передавать вручную.
...
Рейтинг: 0 / 0
07.01.2016, 12:38
    #39142986
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanza,

Опасно передавать в отдельный поток HttpContext.Current не через await/CW как сказал Алексей, так как HttpContext.Current может умереть раньше, чем закончится выполнение работы в потоке. Поэтому нет способа «по-лучше», есть правильный и неправильный способ. Передавать отдельным параметром — неправильно по сути.
...
Рейтинг: 0 / 0
07.01.2016, 19:01
    #39143091
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Да нет, с тасками все работает. По-подробней это WCF с доступом HttpContext (есть такая конфигурация). Основоной код порождает тучу потоков и передает контекст в каждый. Потом ждет WaitAll. Потом покидает скоп и, конечно, контекст исчезает. Но к этому моменту вся работа сделана.
Плохо то, что надо городить огород с передачей контекста, изменением конструкторов, которые теперь принимают контекст.
Как-то это не по-архитектурски.

А почему сам таск доступа к контектсу не имеет, а континью виз имеет?
...
Рейтинг: 0 / 0
08.01.2016, 18:02
    #39143475
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanzaА почему сам таск доступа к контектсу не имеет, а континью виз имеет?Потому что "сам таск" выполняется не через контекст синхронизации, который устанавливает ThreadStatic поле класса, хранящее ссылку HttpContext.Current.
...
Рейтинг: 0 / 0
08.01.2016, 18:08
    #39143480
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanzaОсновоной код порождает тучу потоков и передает контекст в каждый. Потом ждет WaitAll.Можно попробовать отказаться от "ручного" порождения потоков в пользу асинхронного ожидания через порт I/O, другими словами использовать встроенные асинхронные операции для работы с БД, сокетами и т. п.

Так же по возможности заменить WaitAll на await Task.WhenAll .

зы: Если есть такая возможность, конечно же.
...
Рейтинг: 0 / 0
11.01.2016, 20:12
    #39144947
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Привет.
Что-то не работает рецепт с континьб виз. Код
Код: c#
1.
2.
3.
4.
5.
6.
7.
Task task1 = new Task(()=>{});
Task task2 = task1.ContinueWith((t) =>
                {
                    string sql = String.Concat("select Content from WebWelcomeGreet where Mode=",IsUser);
                    result = dal.GetScalar(sql);
                });
 task1.Start();



на этапе "result = dal.GetScalar(sql);" наталкивается на HttpContext.Current=null

Если это то, что вы имели ввиду, почему не работает?
Спасибо.
...
Рейтинг: 0 / 0
12.01.2016, 05:27
    #39145067
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var context = TaskScheduler.FromCurrentSynchronizationContext();

Task task1 = new Task(()=>{});
Task task2 = task1.ContinueWith((t) =>
                {
                    string sql = String.Concat("select Content from WebWelcomeGreet where Mode=",IsUser);
                    result = dal.GetScalar(sql);
                }, context);
task1.Start();



зы: Использовать await удобнее.
...
Рейтинг: 0 / 0
12.01.2016, 18:12
    #39145778
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Вы не могли бы пояснить в чем удобство await?
В коде для ContinueWith вы все равно передаете контекст. Мой вопрос был - как получать контекст автоматически, без передачи?
Передавать его параметром в Task, почти то же самое для меня, что и внедрять его через коструктор или через get или еще как-то.

Вот мой код для async/await

Код: c#
1.
2.
3.
4.
Task task1 = Task.Run(async () =>
{
       result = await Proc0();
});



Здесь при выполнении первого оператора контекст присутствует.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
private Task<string> Proc0()
        {
            Task<string> task = new Task<string>(() =>
            {
                string sql = String.Concat("select Content from WebWelcomeGreet where Mode=", true); //<-- A
                return dal.GetScalar(sql);
            });
            task.Start();
            return task;
        } 



Здесь при выполнении строки А контекста как не было так и нет.
Назад к параметрам? Тогда в чем удобство await?
...
Рейтинг: 0 / 0
12.01.2016, 18:42
    #39145820
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Кстати, ваш код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var context = TaskScheduler.FromCurrentSynchronizationContext();

Task task1 = new Task(()=>{});
Task task2 = task1.ContinueWith((t) =>
                {
                    string sql = String.Concat("select Content from WebWelcomeGreet where Mode=",IsUser);
                    result = dal.GetScalar(sql);
                }, context);
task1.Start();



возвращает упорный NULL для HttpContext.Current
...
Рейтинг: 0 / 0
13.01.2016, 11:53
    #39146248
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanza,
Замыкания - наше все!
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var context = HttpContext.Current;
            Task task1 = new Task(() => { });
            Task task2 = task1.ContinueWith((t) =>
            {
                HttpContext.Current = context;
                string sql = String.Concat("select Content from WebWelcomeGreet where Mode=", IsUser);
                result = dal.GetScalar(sql);
            });
            task1.Start();
...
Рейтинг: 0 / 0
13.01.2016, 16:29
    #39146615
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Это то с чего я начал прежде чем написать сюда.
Это приводит к иньекции контекса через конструктор при передаче из потока в поток и туевой хуче модификаций всех кострукторов.
Между прочим, при таком способе Session не доступен. Application и Cache есть, а сессия нул.
Тем не менее спасибо.
Похоже, проблема неразрешимая.
...
Рейтинг: 0 / 0
13.01.2016, 17:40
    #39146681
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanzaМежду прочим, при таком способе Session не доступен. Application и Cache есть, а сессия нул.
Тем не менее спасибо.
Похоже, проблема неразрешимая.
Если это WCF - то скорее сессию нужно как то включать отдельно.
Нет тут никакой проблемы, контекст передается через Thread.Get/SetData и существует только для текущего потока, который был запущен для обработки запроса. Какого рожна он должен быть виден в других потоках?
ИХМО изначально плохо продуманная архитектура, дикая смесь WCF и HttpContext.
...
Рейтинг: 0 / 0
13.01.2016, 19:52
    #39146758
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
>Какого рожна он должен быть виден в других потоках

Такого рожна, что это дочерние потоки. Можно сконфигурировать основной поток WCF функции так, что она будет ожидать завершения всех запущенных дочерних потоков. И только потом выйдет из скопа. Без всяких операторо Wait.
Задача передать контекст этого потока в дочерние так, чтоб не модифицировать больше количество кода, а именно конструкторы.

>дикая смесь WCF и HttpContext
???
WCF работает с контекстом ASP.NET непринужденно. Скорее дикая смесь - это ваши представление о WCF. Без обид.
WCF может работать со своим контекстом в модели PerSession, но не все байндинги это поддерживают. basicHttpBinding, который я использую, один из них. Я вынужден использовать ASP.NET контекст.
Спасибо.
...
Рейтинг: 0 / 0
14.01.2016, 05:29
    #39146909
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanzaКстати, ваш код
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var context = TaskScheduler.FromCurrentSynchronizationContext();

Task task1 = new Task(()=>{});
Task task2 = task1.ContinueWith((t) =>
                {
                    string sql = String.Concat("select Content from WebWelcomeGreet where Mode=",IsUser);
                    result = dal.GetScalar(sql);
                }, context);
task1.Start();



возвращает упорный NULL для HttpContext.Current
В .Net Framework 4.5.1 работает. Уточни версию, такое поведение появилось сравнительно недавно.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    public class HomeController : Controller
    {        
        public Task<string> Test()
        {
            var context = TaskScheduler.FromCurrentSynchronizationContext();

            return
                Task.Factory
                    .StartNew(() => { Thread.Sleep(500); })
                    .ContinueWith(t => 
                    {
                        return System.Web.HttpContext.Current.Request.UserHostAddress;
                    }, context);
        }
    }
...
Рейтинг: 0 / 0
14.01.2016, 05:33
    #39146910
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanzaПохоже, проблема неразрешимая."Нам бы только иностранное ругать." (ц) из к/ф "О бедном гусаре замолвите слово"
...
Рейтинг: 0 / 0
15.01.2016, 01:02
    #39147834
mabanza
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
Версия 4.5

Есть разница между моим и вашим кодом.
Я создаю пустую задачу и не передаю контекст. Я передаю контекст только в continueWith.
В вашем коде контекст передается сразу и в фактори.
Может в этом различие. Попробую попозже.
...
Рейтинг: 0 / 0
15.01.2016, 04:37
    #39147850
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к HttpContext.Current из дочернего потока
mabanzaЕсть разница между моим и вашим кодом.
Я создаю пустую задачу и не передаю контекст. Я передаю контекст только в continueWith.
В вашем коде контекст передается сразу и в фактори.
Может в этом различие. Попробую попозже.В моём коде контекст синхронизации передаётся только в ContinueWith.
...
Рейтинг: 0 / 0
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Доступ к HttpContext.Current из дочернего потока / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]