Я хочу получить изображение каждые 3 секунды с ip-камеры и поместить его в элемент управления изображением (приложение WPF).Захват изображения с помощью WebRequest вызывает зависание пользовательского интерфейса
Я использую этот код:
DispatcherTimer определение
DispatcherTimer dispatcherTimer = new DispatcherTimer(TimeSpan.FromSeconds(3), DispatcherPriority.Background, DispatcherTimer_Tick, Application.Current.Dispatcher);
Изображение захватывая код
private void DispatcherTimer_Tick(object sender, EventArgs evA)
{
Dispatcher.Invoke(DispatcherPriority.Background,
new Action(() =>
{
try
{
BitmapFrame src;
var webRequest = (HttpWebRequest)WebRequest.Create(@"http://camera_ip/cgi-bin/video.cgi?msubmenu=jpg");
webRequest.Credentials = new NetworkCredential("user", "password");
webRequest.Proxy = null;
var response = (HttpWebResponse)webRequest.GetResponse();
var stream = response.GetResponseStream();
var streamReader = new StreamReader(stream);
src = BitmapFrame.Create(streamReader.BaseStream);
imageTelecamera.BeginInit();
imageTelecamera.Source = src;
imageTelecamera.EndInit();
}
catch (Exception ex)
{
DoLogD($"Error: {ex.Message}");
}
}
));
}
Он работает нормально, но когда я захватить изображение интерфейс замерзает в течение нескольких миллисекунд.
Почему диспетчер не работает на фоне, не затрагивая интерфейс?
Это не имеет смысла называть 'Dispatcher.Invoke' в обработчике тике DispatcherTimer, так как метод обработчика уже вызываемый в потоке пользовательского интерфейса. Кроме того, Invoke не вызывает ничего в фоновом потоке. Это делается наоборот: если вы вызываете его из фонового потока, он вызывает действие в потоке пользовательского интерфейса. – Clemens
Возможно, вы захотите назвать свой захватный код фоновым потоком (например, 'System.Threading.Timer') и вызвать' imageTelecamera.Source = src; 'в диспетчерском действии. Также неясно, что здесь должны делать «BeginInit» и «EndInit», поскольку вы, кажется, называете их в элементе управления Image, что совсем необязательно. – Clemens