Я создал свой собственный FilePreviewHandler для предварительного просмотра некоторых файлов, таких как Explorer, потому что в настоящее время я создал собственный браузер файлов.
Когда я нажимаю элементы в ListView, я могу просматривать файлы, такие как explorer.
PreviewHandlerкоторый находится в моем файловом браузере. Содержит класс WebBrowser для загрузки видеофайлов / текстовых файлов, PictureBox для загрузки файлов изображений и ShellExPreviewHandler для других расширений.
Проблема, с которой это связано, *. 1007 *
Когда япопытка загрузить большой файл, такой как большой файл размером 100 МБ или более, или большой файл изображения, например, 8000x4000 пикселей, форма зависает до тех пор, пока не загрузится файл.
Область кода для PreviewHandler:
public void Open( String FileName )
{
if ( !Enabled || Last == FileName )
{
return;
}
//FileName = DriveUtil.RevealPath( FileName );
String FileType = MIMEAssistant.GetMIMEType( FileName );
// Image Files
if ( ImagePreviewTarget.Where( x => FileType.Contains( x ) ).Count() > 0 )
{
IsProgress = true;
try
{
if ( ImagePreviewHandler.Image != null )
{
ImagePreviewHandler.Image.Dispose();
GC.Collect();
}
Image TargetImage = Image.FromFile( FileName );
if ( TargetImage.Width > this.Width || TargetImage.Height > this.Height )
{
ImagePreviewHandler.SizeMode = PictureBoxSizeMode.Zoom;
}
else
{
ImagePreviewHandler.SizeMode = PictureBoxSizeMode.CenterImage;
}
ImagePreviewHandler.Image = TargetImage;
ImagePreviewHandler.BringToFront();
}
catch
{
ImagePreviewHandler.Image = null;
GC.Collect();
ShellExPreviewHandler.BringToFront();
IsProgress = false;
}
}
// WebPreviewArea
// This area doesn't make any problem. So I hide my codes on here.
// PdfPreviewArea
// Currently I don't use Pdf PreviewHandler. So I also hide my codes on here.
// Other extensions
else
{
ShellExPreviewHandler.Open( FileName );
ShellExPreviewHandler.BringToFront();
}
Last = FileName;
}
Что я пробовал:
Я пытался использовать для этого Thread, Task.Run, Backgroundworker, но все это требует MyForm.Invoke для рисования элементов управления.
Часть потока =>
Thread Preview = new Thread( (ThreadStart) =>
{
try
{
if ( FilePreview != null && Browser.PreviewOpened )
{
Console.WriteLine( "FilePreview.Open Task Start" );
FilePreview.Open( Browser.SelectedPath );
Console.WriteLine( "FilePreview.Open Task Completed" );
}
}
catch ( Exception ex )
{
Console.WriteLine( ex.StackTrace );
}
Process = false;
} );
Preview.Start();
if ( Preview.Join( TimeSpan.Zero ) )
{
DateTime dt = DateTime.Now;
TimeSpan Interval = TimeSpan.FromMilliseconds( 50 );
while ( Process )
{
if ( dt + Interval < DateTime.Now )
{
Application.DoEvents();
dt = DateTime.Now;
}
}
}
Часть Task.Run =>
var t = Task.Run( () =>
{
try
{
this.Invoke( new MethodInvoker( delegate
{
if ( Browser.SelectedItems.Count == 0 )
{
FilePreview.Initialize();
return;
}
else if ( Browser.SelectedItems[0].ForeColor == Color.Pink )
{
FilePreview.Initialize();
return;
}
if ( FilePreview != null && Browser.PreviewOpened )
{
FilePreview.Open( Browser.SelectedPath );
}
} ) );
}
catch
{
}
} );
BackgroundWorker =>
private void PreviewWorker_DoWork( object sender, DoWorkEventArgs e )
{
FilePreviewHandler FilePreview = null;
GCS.Windows.Forms.FileFolderList Browser = null;
switch ( PreviewStatus ) {
case BrowserStatus.Local:
FilePreview = LocalFilePreviewHandler;
Browser = LocalBrowser;
break;
case BrowserStatus.Network:
FilePreview = NetFilePreviewHandler;
Browser = NetworkBrowser;
break;
}
if ( FilePreview == null )
{
return;
}
this.Invoke( new MethodInvoker( delegate
{
FilePreview.Open( Browser.SelectedPath );
} ) );
}
Я думаю, эта часть вызывает зависание моей программы.
есть идеи, чтобы избежать зависания формы при загрузке больших файлов для PreviewHandler?