0

このコードは、WPF アプリケーションを極端にフリーズさせます。

それを修正する機会はありますか?

var getScreenshot = Task.Factory.StartNew(() => 
{                       
    Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new ThreadStart(() => {                        
    #region Main
    try
    {
        Graphics gfx;
        Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
        gfx = Graphics.FromImage(bmp);
        WindowInteropHelper windowInteropHelper = new WindowInteropHelper(this);
        Screen screen = Screen.FromHandle(windowInteropHelper.Handle);
        gfx.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, screen.Bounds.Size, CopyPixelOperation.SourceCopy);
         MemoryStream ms = new MemoryStream();
        byte[] bitmapData = null;
        using (bmp)
        {
            bmp.SetResolution(72, 72);
            ImageCodecInfo myImageCodecInfo;
            myImageCodecInfo = GetEncoderInfo("image/jpeg");
            System.Drawing.Imaging.Encoder myEncoder;
            myEncoder = System.Drawing.Imaging.Encoder.Quality;
            EncoderParameters encoderParameters = new EncoderParameters();
            EncoderParameter encoderParameter = new EncoderParameter(myEncoder, 25L);
            encoderParameters.Param[0] = encoderParameter;
            bmp.Save(ms, myImageCodecInfo, encoderParameters);                               
            bitmapData = ms.ToArray();
        }
        if (bitmapData != null)
            DataProvider.UpdateScreen(((PlayerConfiguration)App.Current.Properties["PlayerConfig"]).InstallationKey, bitmapData);
    }
    catch (Exception ex)
    {
        #region Error
        LogEntry l = new LogEntry();
        l.Message = string.Format("{0}", ex.Message);
        l.Title = "GetScreen() Error";
        l.Categories.Add(Category.General);
        l.Priority = Priority.Highest;

        CustomLogger.WriteErrorLog(l, "GetScreen");

        #endregion
    }
    #endregion
  }));

}, TaskCreationOptions.LongRunning)
.ContinueWith(x => x.Dispose()); 
4

1 に答える 1

3

はい、すべてを UI スレッドにディスパッチしないでください。回避できる最小量のコードのみをInvoke呼び出しに入れます。実際にUIを更新しているときです。すべてがコード内の呼び出し呼び出しにあるため、UI はすべてが完了するまでブロックされます。

于 2012-04-13T18:56:54.367 に答える