URI для iframe должен выглядеть примерно так:
/viewer.html?file=blob:19B579EA-5217-41C6-96E4-5D8DF5A5C70B
Теперь FF, Chrome, IE 11 и Edge отображают PDF в средстве просмотра в iframe, переданном через стандартный UIB-код в URL-адрес.
Нет, класс Thread
запечатан
. Обоснование этого решения состоит в том, что это настолько сложная и низкоуровневая оболочка вокруг объекта ядра, что вы не должны связываться с ней.
Один вопрос к вам, однако, почему вы хотите переопределить метод Start? Чего вы пытаетесь достичь?
Не знаю, почему вы могли бы захотеть это сделать (или даже должны были бы это сделать, если бы это было возможно), но есть способ обойти тот факт, что класс Thread
является запечатанным
] - используя методы расширения. С технической точки зрения, это просто добавление перегрузки к группе методов Start
(а не переопределение), но это все равно может быть полезно в вашем контексте.
Что-то вроде этого может быть тем, что вам нужно:
public static void Start(this Thread thread, int foo)
{
// Your code here.
thread.Start();
}
Затем вы можете просто назвать его так:
var thread = new Thread();
thread.Start(123);
Класс Thread закрыт, но вот хороший сайт для изучения потоков . Также обратите внимание на поток Stackoverflow здесь: Ссылка на многопоточность?
Нет ...
Класс Thread запечатан ...
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public sealed class Thread : CriticalFinalizerObject,
_Thread
Спасибо
Нет, это запечатанный класс, что означает, что вы не можете наследовать от него.
Относительно того, зачем кому-то это нужно: многие языки (например, Java) и / или API-интерфейсы потоков (например, Qt) позволяют разработчикам реализовывать потоки путем наследования от базового класса «потока» , а затем перегрузка метода, реализующего процедуру потока.
Широко использовав эту модель в Qt, я на самом деле нахожу ее очень удобной - вместо того, чтобы нацеливать потоки на какую-то функцию или метод, что часто приводит к странным и / или запутанным код, весь поток содержится внутри объекта.
Вот пример кода с использованием Qt API:
class MyThread : public QThread
{
Q_OBJECT
protected:
void run();
};
void MyThread::run()
{
...something I need threaded...
}
QThread - это базовый класс потоковой передачи Qt. Чтобы использовать MyThread, создайте экземпляр объекта потока и вызовите QThread :: start (). Код, который появляется в повторной реализации run (), затем будет выполняться в отдельном потоке.
What ' В этом хорошо то, что я думаю, это позволяет вам действительно содержать все, что нужно потоку, внутри одного объекта, и (по моему опыту) это создает очень согласованную объектную модель. Я не думаю, что он отвечает всем потребностям, но я был немного удивлен, что C # не имеет такой базовой модели потоковой передачи, если честно.
Я определенно не верю, что класс Thread в C # запечатан из-за сложности ядра ; если Qt может предоставить кроссплатформенную библиотеку потоковой передачи, которая позволяет наследование QThread, я не вижу реальной причины, по которой MSFT не может предоставить такую же возможность в классе потоковой передачи в C #.
Честно говоря, у меня есть такая базовая модель потоковой передачи.Я определенно не верю, что класс Thread в C # является запечатанным из-за сложности ядра; если Qt может предоставить кроссплатформенную библиотеку потоковой передачи, которая позволяет наследование QThread, я не вижу реальной причины, по которой MSFT не может предоставить такую же возможность в классе потоковой передачи в C #.
Честно говоря, у меня есть такая базовая модель потоковой передачи.Я определенно не верю, что класс Thread в C # является запечатанным из-за сложности ядра; если Qt может предоставить кроссплатформенную библиотеку потоковой передачи, которая позволяет наследование QThread, я не вижу реальной причины, по которой MSFT не может предоставить такую же возможность в классе потоковой передачи в C #.
Я также привык использовать ту же логику в приложениях Java, и имеет серьезный смысл объединить поток в объект, который затем отделяет начало нового процесса от его родительского. Точно так же разочарованный C # не поддерживает этот подход. Дэйв П.
using System.Threading;
namespace NGrubb.Threading {
public abstract class BaseThread {
private Thread m_thread;
public BaseThread() {
m_thread = new Thread( Run );
}
public void Start() {
m_thread.Start();
}
protected abstract void Run();
}
}