Здравствуйте, _ichensky, Вы писали:
_>Надо сделать приложение так что бы можно было время от времени запускать высокоприоритетный код(напр. для расчета гарфики, разной анимации) и в тоже время, приложение должно постоянно выполнять много разных задач(напр. скачивать, обрабатывать данные из инета и скидывать результат на диск). _>А когда появляется высоприорететная задача(а их может быть много) надо сделать так что бы остальные задачи передавали свои кванты процессорного времени этой задаче.
Так, ставьте потокам разные приоритеты — они реально работают.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте, _ichensky, Вы писали:
_>Здравствуйте, _>Как лучше всего сделать обертку на функцией 'funс' что бы код выполнялся в порядке 1.3.2.4
Многопоточный код по определению предлагает произвольный порядок выполнения конкурентных операций.
Нужен определённый порядок — или возитесь с примитивами синхронизации, или просто перепишите код аля
var t1 = Task.Delay(123);
var t3 = Task.Delay(456);
await Task.WhenAll(t1, t3);
var t2 = Task.Delay(456);
var t4 = Task.Delay(789);
await Task.WhenAll(t2, t4);
_>Если класс 'A' и 'func' менять нельзя.
Никак, если не связываться с извращениями типа "мокнуть Thread.Sleep()". Для продакшна ни один из вариантов не годится, поэтому тратить на них время незачем.
Здравствуйте, Sinix, Вы писали:
S>Нужен определённый порядок — или возитесь с примитивами синхронизации, или просто перепишите код аля
Ну и нафига вообще тогда нужны потоки? Просто тупо вызвать их по порядку — и всего делов.
Здравствуйте, _ichensky, Вы писали:
_>Идеально подошлобы что-то вроде Task.Factory.StarNew, но чтобы таска сразу получила найвысший приоритет перед остальными тасками и если понадобиться — были приостановлены все другие таски, но по-умолчанию Task.Factory может положить таску в пул и ожидать завершения некоторых других.
Нельзя -> нет исходников? Тогда воткнуть в него через IL в рантайме любой WaitHandle (lock, wait, pulse или более высокоуровневые, типа Auto/ManualResetEvent)
Любой поток может быть засуспенден системой. А в случае .NET, ещё и GC. Поэтому как бы ты не выставлял тайминги, найдётся ситуация, в которой они дадут сбой. И тут не важно, началось их выполнение одновременно или нет.
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт
Здравствуйте, _ichensky, Вы писали:
_>Здравствуйте, _>Как лучше всего сделать обертку на функцией 'funс' что бы код выполнялся в порядке 1.3.2.4 _>Если класс 'A' и 'func' менять нельзя. https://msdn.microsoft.com/ru-ru/library/system.threading.autoresetevent(v=vs.110).aspx
Все остальное — шаманство и игры с вероятностями которе могу точень больно ударить на проде и не воспроизводиться на тестовом енве.
Здравствуйте, Sinix, Вы писали:
_>>Если класс 'A' и 'func' менять нельзя. S>Никак, если не связываться с извращениями типа "мокнуть Thread.Sleep()". Для продакшна ни один из вариантов не годится, поэтому тратить на них время незачем.
Если под Windows то, мокать Thread.Sleep не обязательно — там используется SleepEx который "alertable"
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Здравствуйте,
Как лучше всего сделать обертку на функцией 'funс' что бы код выполнялся в порядке 1.3.2.4
Если класс 'A' и 'func' менять нельзя.
-- Task , ThreadPool — не подойдут т.к. код выпоняет "не немедленно"
-- new Thread — не пойдет, т.к. тред может висеть долго.
void main(){
var a = new A();
// ... код 1
a.func()
// ... код 2
}
class A {
func(){
// ... код 3
Thread.Sleep(100);
// ... код 4
}
}
Идеально подошлобы что-то вроде Task.Factory.StarNew, но чтобы таска сразу получила найвысший приоритет перед остальными тасками и если понадобиться — были приостановлены все другие таски, но по-умолчанию Task.Factory может положить таску в пул и ожидать завершения некоторых других.
Підтримати Україну у боротьбі з країною-терористом.
Надо сделать приложение так что бы можно было время от времени запускать высокоприоритетный код(напр. для расчета гарфики, разной анимации) и в тоже время, приложение должно постоянно выполнять много разных задач(напр. скачивать, обрабатывать данные из инета и скидывать результат на диск).
А когда появляется высоприорететная задача(а их может быть много) надо сделать так что бы остальные задачи передавали свои кванты процессорного времени этой задаче.
Підтримати Україну у боротьбі з країною-терористом.
Здравствуйте, _ichensky, Вы писали:
_>Здравствуйте, Философ, Вы писали:
_>Надо сделать приложение так что бы можно было время от времени запускать высокоприоритетный код(напр. для расчета гарфики, разной анимации) и в тоже время, приложение должно постоянно выполнять много разных задач(напр. скачивать, обрабатывать данные из инета и скидывать результат на диск). _>А когда появляется высоприорететная задача(а их может быть много) надо сделать так что бы остальные задачи передавали свои кванты процессорного времени этой задаче.
Ну так поступай, так как делает сборщик мусора.
Получай все потоки:
Process.GetCurrentProcess().Threads;
И приостанавливай все, кроме приоритетных:
[DllImport("kernel32.dll")]
static extern UInt32 SuspendThread(IntPtr threadHandle);
"Хаос всегда побеждает порядок, поскольку лучше организован." (с) Терри Пратчетт