2015-01-28 2 views
-1

이벤트가 구독 취소되지 않는 이유를 모르겠지만 나를 죽입니다 ... CompositionTarget.Rendering - RenderingEvent와 동일한 아이디어를 사용하여 작동하는 일시 중지 단추가 있습니다. 아마도,이벤트 구독 취소 없음

private EventHandler RenderingEvent; 

    StopSimulation(sender, t);// how i am calling it 

    private void StopSimulation(object sender, ElapsedEventArgs e) 
    { 
     time = DateTime.Now; 
     int removedtime = 0; 
     InSimulation = false; 
     aTimer.Enabled = false; 
     CompositionTarget.Rendering -= RenderingEvent; // doesnt seem to stop it 
    } 


    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     CompositionTarget.Rendering -= RenderingEvent; 
     position = new Point(5, HighestPoint * MetresPerPixel); 
     //acceleration = new Vector(0, 30); // y direction is downwards 
     int removedtime = 0; 
     time = DateTime.Now; 
     RenderingEvent = (s, g) => OnRendering(s, g, removedtime, time); 
     CompositionTarget.Rendering += RenderingEvent; 
     btn_Pause.Content = "Pause"; 
    } 

내 "완료"코드 (제거 모든 쓰레기)

 using System; 
     using System.Collections.Generic; 
     using System.Linq; 
     using System.Text; 
     using System.Threading.Tasks; 
     using System.Windows; 
     using System.Windows.Controls; 
     using System.Windows.Data; 
     using System.Windows.Documents; 
     using System.Windows.Input; 
     using System.Windows.Media; 
     using System.Windows.Media.Imaging; 
     using System.Windows.Navigation; 
     using System.Windows.Shapes; 
     using System.Threading; 
     using System.Timers; 
     using System.ComponentModel; 
     using System.Windows.Media.Animation; 
     using System.Text.RegularExpressions; 
     namespace WpfApplication3 
     { 
public partial class MainWindow : Window 
{ 
    bool LabelExist = false; 
    int count = 1; 
    bool InSimulation = false; 
    bool ModelModeAsParticle; 
    static System.Timers.Timer aTimer; 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
    private Point position; // in pixels 
    private Vector Velocity; // in pixels per second 
    private Vector acceleration; // in pixels per square second 
    private DateTime time; 
    private EventHandler RenderingEvent; 
    private System.Timers.ElapsedEventHandler TimerEvent; 
    private double TimeConstant; 
    private double TimersTime; 
    private double MetresPerPixel; 
    double HighestPoint, LowestPoint; 
    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     CompositionTarget.Rendering -= RenderingEvent; 
     position = new Point(5, HighestPoint * MetresPerPixel); 
     //acceleration = new Vector(0, 30); // y direction is downwards 
     int removedtime = 0; 
     time = DateTime.Now; 
     RenderingEvent = (s, g) => OnRendering(s, g, removedtime, time); 
     CompositionTarget.Rendering += RenderingEvent; 
     btn_Pause.Content = "Pause"; 
    } 
    private void OnRendering(object sender, EventArgs g, int removedtime, DateTime t) 
    { 
     var now = DateTime.Now.AddSeconds(-removedtime); 
     var dt = (now - t).TotalSeconds; 
     time = now; 
     position += Velocity * dt; 
     Velocity += acceleration * dt; 
     projectileGeometry.Center = position; 
    } 
    void LoadStaticsAndStart(object sender, RoutedEventArgs e) 
    { 
     if (FormatCheck(txtb_AngleOLaunch) == false || FormatCheck(txtbox_InitialVelocity) == false || FormatCheck(txtbox_TimeOfFlight) == false) 
     { 
     } 
     else 
     { 
      MPP(newParticle, newEnvironment); 
      OnLoaded(this, e); 
      double HVelTemp = newParticle.InitialVelocity.HorizontalVelocity * MetresPerPixel; 
      double VVelTemp = newParticle.InitialVelocity.VerticalVelocity * MetresPerPixel * -1; 
      Velocity = new Vector(HVelTemp, VVelTemp); // y direction is downwards 
      acceleration = new Vector(0, -1*newEnvironment.gravity*MetresPerPixel); // y direction is downwards 
      aTimer = new System.Timers.Timer(200); 
      TimerEvent = (s, t) => onTimedEvent(s, t, newParticle, newEnvironment); 
      aTimer.Elapsed += TimerEvent; 
      InSimulation = true; 
      aTimer.Enabled = true; 
     } 
    } 
    int DigitAccuracy = 2; 
    void onTimedEvent(Object sender, ElapsedEventArgs t, particle newProjectile, Environment newEnvironment) 
    { 
     if (newProjectile.Time < newProjectile.TimeOfFlight && InSimulation == true) 
     { 
     newProjectile.Time = Math.Round(TimersTime,1); 
     } 
     else if (newProjectile.TimeOfFlight == newProjectile.Time) 
     { 
      StopSimulation(sender, t); 
     } 
    } 
    private void StopSimulation(object sender, ElapsedEventArgs e) 
    { 
     InSimulation = false; 
     aTimer.Enabled = false; 
     CompositionTarget.Rendering -= RenderingEvent; 
    } 
    private void btn_Pause_Click(object sender, RoutedEventArgs e) 
    { 
     if ((string)btn_Pause.Content == "Pause") 
     { 
      aTimer.Enabled = false; 
      CompositionTarget.Rendering -= RenderingEvent; 
     } 
     else if (InSimulation == true && (string)btn_Pause.Content != "Pause") 
     { 
      aTimer.Enabled = true; 
      RenderingEvent = (s, g) => OnRendering(s, g, removedtime, time); 
      CompositionTarget.Rendering += RenderingEvent; 
     } 
     else if (InSimulation != true) 
     { 
     } 
    } 
    private void btn_fastforward_Click(object sender, RoutedEventArgs e) 
    { 
     if (InSimulation == true) 
     { 
     CompositionTarget.Rendering -= RenderingEvent; 
     RenderingEvent = (s, g) => OnRendering(s, g, removedtime, time); 
     CompositionTarget.Rendering += RenderingEvent; 
     } 
     else if (InSimulation == false) 
     { 
     } 
    } 
    private void btn_backwards_Click(object sender, RoutedEventArgs e) 
    { 
     if (InSimulation == true) 
     { 
     CompositionTarget.Rendering -= RenderingEvent; 
     RenderingEvent = (s, g) => OnRendering(s, g, removedtime, time); 
     CompositionTarget.Rendering += RenderingEvent; 
     } 
     else if (InSimulation == false) 
     { 
     } 
    } 
+1

문제를 보여주는 짧지만 완전한 프로그램을 보여 주면 정말 도움이됩니다. –

+0

StopSimulation()을 호출하기 전에 OnLoaded가 호출 되었습니까? 이벤트 처리기에 필드를 사용하는 이유는 무엇입니까? 그것을위한 개인적인 방법을 작성하십시오. – helb

+0

@helb 예, 멈춤 버튼이 작동하지만 StopSimulation에서 작동하지 않는 것 같습니다 – ObnoxiousFrog

답변

0

진단하려면이

내 코드는 ...라고하지만, 그것을 중지하지 않는 것 연결/분리를 제외하고 CompositionTarget.RenderingEvent 이벤트를 효과적으로 래핑하는 새 이벤트를 만듭니다.

private int _eventSubscriptionCount = 0; 
public event EventHandler<EventArgs> RenderingEventWrapper 
{ 
    add 
    { 
     CompositionTarget.RenderingEvent += value; 
     _eventSubscriptionCount++; 
    } 
    remove 
    { 
     CompositionTarget.RenderingEvent -= value; 
     _eventSubscriptionCount--; 
    } 
} 

Th 더 이상 구독이 없을 때 구독중인 구독자 수를 확인하십시오 ... 추가/제거 부분을 디버깅하면 트릭을 수행하고 실행 중단이 발생할 때 호출 스택을 검사합니다.

관련 문제