I made my own FilePreviewHandler for preview some files like Explorer because currently I made custom file browser.
When I click items on ListView, I can preview files like explorer.
The PreviewHandler which is in my file browser Contains WebBrowser Class for load Movie/Text files, PictureBox for load Image files, and ShellExPreviewHandler for other extensions.
The problem which engaged is like this.
When I attempt to load large file such 100mb or more large file or big image file like 8000x4000 pixels, form freezes until it load file.
Code Area for 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;
}
What I Tried :
I tried to use Thread, Task.Run, Backgroundworker for this, but all of this requires MyForm.Invoke to draw controls.
Thread Part =>
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 Part =>
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 );
} ) );
}
I think this part makes my program freezing.
any idea to avoid form freezing during load large files for PreviewHandler?