这里需要线程通信吗

本文关键字:通信 线程 这里 | 更新日期: 2023-09-27 18:28:10

我正试图让这段代码在到达一天中的特定时间后向屏幕添加一些内容。它被操纵成一个事件。代码在单线程程序上工作,但不使用线程,这正是我所需要的。根据需要添加数据,但不会像在单线程执行中那样显示在屏幕上(timeStackStackPanelTimeEntryUserControl)。

代码:

主窗口.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        SM = new SessionManager();
        SM.NewDayEvent += SplitSession;
        InitializeComponent();
        //Code removed for clarity
    }
    private void SplitSession(object sender, EventArgs ea)
    {
        SM.SplitSession();
        string s =((TimeEntry)SM.Entries.Last(x=>x.GetType()==typeof(TimeEntry))).Data.Comment;
        AddSessionStamp();
        entryAdder_Click(null, null);
        ((TimeEntry)SM.Entries.Last(x => x.GetType() == typeof(TimeEntry))).Data.Comment = s;
        this.Focus();
    }
    private void AddSessionStamp()
    {
        TextBlock timeStamp = new TextBlock();
        timeStamp.Text = "-----------" + SM.CurrentSession.Name + "-----------";
        timeStack.Children.Add(timeStamp);
    }
    private void entryAdder_Click(object sender, RoutedEventArgs e)
    {
        //Subscribe to the assorted events
        TimeEntry newTE = SM.addNewTimeEntry();
        //Subscribe to the assorted events
        RegisterToTimeEntry(newTE);
        timeStack.Children.Add(newTE);
    }
}

SessionManager.cs:

public class SessionManager : INotifyPropertyChanged
{
    public delegate void NewDayEventHandler(object sender, EventArgs ea);
    public event NewDayEventHandler NewDayEvent;
    private Timer _timer;
    private Stopwatch _clockWatch;
    private DateTime current_time;
    #region Properties
    public DateTime CurrentTime
    {
        get
        {
            return DateTime.Now;
        }
        set
        {
            if (current_time != value)
            {
                current_time = value;
                OnPropertyChanged("CurrentTime");
            }
        }
    }
    public List<Session> OpenSessions { get; private set; }
    public ObservableCollection<UIElement> Entries { get; private set; }
    public Session CurrentSession
    {
        get
        {
            return current_session;
        }
        set
        {
            if (current_session != value)
            {
                current_session = value;
                OnPropertyChanged("CurrentSession");
            }
        }
    }
    #endregion

    public SessionManager()
    {
        _clockWatch = new Stopwatch();
        _timer = new Timer(1000);//one second
        _timer.Elapsed += timerElapsed;
        //Code removed for clarity
        current_time = new DateTime();
        CurrentTime = DateTime.Now;
        _timer.Start();
    }

    #region Methods
    #region Event Methods
    /// <summary>
    /// Registered to Timer.Elapsed Event
    /// (See constructor)
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void timerElapsed(object sender, ElapsedEventArgs e)
    {
        CurrentTime = DateTime.Now;
        if ((CurrentTime.TimeOfDay.Hours == 13 &&
            CurrentTime.TimeOfDay.Minutes == 23 &&
            CurrentTime.TimeOfDay.Seconds == 0) &&
            NewDayEvent != null)
        {
            NewDayEvent(this, new EventArgs());
        }
    }
    #endregion
    #region Class Methods
    private void OnPropertyChanged([CallerMemberName] string member_name = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(member_name));
        }
    }
    #endregion
    #endregion
    public void SplitSession()
    {
        Session prevSesh = CurrentSession;
        OpenSessions.Add(new Session());
        CurrentSession = OpenSessions.Last();
        current_session.addComment(
            ((TimeEntry)Entries.Last(
            x => x.GetType() == typeof(TimeEntry))
            ).Data.Comment);
    }
}

这里需要线程通信吗

事件处理程序函数在引发事件的线程所在的线程中执行。问题是,不能从Dispatcher线程之外的另一个线程更新UI。您需要在Dispatcher Invoke或BeginInvoke:中执行回调函数(或至少更新部分)

Application.Current.Dispatcher.Invoke(new Action(() => {
    //your UI update
}));