FilterIndex ... DefaultExt используется только во время сохранения. Индекс 1 основан, поэтому, если вы хотите выбрать второй oprion, тогда:
dlg.FilterIndex = 2;
Метод Thread.Abort () (строго) устарел.
Обе темы и задачи должны взаимодействовать при остановке, иначе вы рискует покинуть систему в неустойчивом / неопределенном состоянии.
Если вам нужно запустить Process и убить его извне, единственным безопасным вариантом будет запуск его в отдельном AppDomain.
Хотя можно прервать поток, на практике почти всегда это очень плохая идея. Сокращение потока означает, что нить не получает возможность очистить после себя, оставив ресурсы восстановленными и вещи в неизвестных состояниях.
На практике, если вы прервите поток, вы должны сделать это только вместе с убийством процесса. К сожалению, слишком много людей думают, что ThreadAbort - это жизнеспособный способ остановить что-то и продолжить, это не так.
Поскольку Tasks запускаются как потоки, вы можете вызывать ThreadAbort на них, но как и в случае с общими нитями, вы почти никогда хочу сделать это, кроме как в крайнем случае.
Если у вас есть конструктор задач, мы можем извлечь поток из задачи и вызвать thread.abort.
Thread th = null;
Task.Factory.StartNew(() =>
{
th = Thread.CurrentThread;
while (true)
{
Console.WriteLine(DateTime.UtcNow);
}
});
Thread.Sleep(2000);
th.Abort();
Console.ReadKey();
Но могу ли я прервать задачу (в .Net 4.0) таким же образом, а не механизмом отмены. Я хочу немедленно убить Задачу.
blockquote>Другие ответчики сказали вам не делать этого. Но да, вы можете сделать это. Вы можете предоставить
Thread.Abort()
в качестве делегата, который будет вызван механизмом отмены задачи. Вот как вы могли бы настроить это:class HardAborter { public bool WasAborted { get; private set; } private CancellationTokenSource Canceller { get; set; } private Task<object> Worker { get; set; } public void Start(Func<object> DoFunc) { WasAborted = false; // start a task with a means to do a hard abort (unsafe!) Canceller = new CancellationTokenSource(); Worker = Task.Factory.StartNew(() => { try { // specify this thread's Abort() as the cancel delegate using (Canceller.Token.Register(Thread.CurrentThread.Abort)) { return DoFunc(); } } catch (ThreadAbortException) { WasAborted = true; return false; } }, Canceller.Token); } public void Abort() { Canceller.Cancel(); } }
отказ: не делайте этого.
Вот пример того, что не делать:
var doNotDoThis = new HardAborter(); // start a thread writing to the console doNotDoThis.Start(() => { while (true) { Thread.Sleep(100); Console.Write("."); } return null; }); // wait a second to see some output and show the WasAborted value as false Thread.Sleep(1000); Console.WriteLine("WasAborted: " + doNotDoThis.WasAborted); // wait another second, abort, and print the time Thread.Sleep(1000); doNotDoThis.Abort(); Console.WriteLine("Abort triggered at " + DateTime.Now); // wait until the abort finishes and print the time while (!doNotDoThis.WasAborted) { Thread.CurrentThread.Join(0); } Console.WriteLine("WasAborted: " + doNotDoThis.WasAborted + " at " + DateTime.Now); Console.ReadKey();
[/g1]
using System;
using System.Threading;
using System.Threading.Tasks;
...
var cts = new CancellationTokenSource();
var task = Task.Run(() => { while (true) { } });
Parallel.Invoke(() =>
{
task.Wait(cts.Token);
}, () =>
{
Thread.Sleep(1000);
cts.Cancel();
});
Это простой фрагмент, чтобы прервать бесконечную задачу с помощью CancellationTokenSource .
Task.Wait(...)
возобновится со следующим утверждением. Вы можете легко проверить это, установив точку прерывания внутри цикла while
.
– Silvermind
18 July 2017 в 22:51