Close MessageBox when incoming new message

馋奶兔 提交于 2020-01-06 02:53:12

问题


i created simple application to send and receive message using C# and GsmComm Library. if there is a new incoming message my application will show messageBox that new message arrived. my problem is when i have many new message, messageBox will show so many messageBox notication. How can I just show the last single message box using code?

this mycode:

private void comm_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    var obj = e.IndicationObject;
    if (obj is MemoryLocation)
    {
        var loc = (MemoryLocation)obj;
        var msg = string.Format("New message received in storage \"{0}\", index {1}.",
                                loc.Storage, loc.Index);
        MessageBox.Show(msg);
        return;
    }
}

i confuse to fix this, i tried to another way using form to show new incoming notif form1.showDialog(); but same problem first form show cannot be closed when new form opened. this my reference: https://stackoverflow.com/a/13445167/3319555

I really thanks if anyone can help me..thanks


回答1:


If you're using your second solution of displaying a form with form.ShowDialog() you can store the forms in a list. Then, when a new form needs to be displayed, you can iterate through the list and close each open form with form.Close(). Assuming that your comm_MessageReceieved method is run on another thread, which I assume is driven via an IO completion port, then something like this perhaps?

List<MyForm> formList = new List<MyForm>();

readonly object formListLock = new object();

private void comm_MessageReceived(object sender, MessageReceivedEventArgs e)
{
    /// you need to lock the List for thread safe access
    lock (formListLock) 
    {
        /// iterate over a copy of the list to avoid mutating the list under iteration
        foreach (MyForm form in formList.ToList())
        {
            form.ThreadSafeClose();
        }
    }

    string msg = "message";
    using (MyForm form = new MyForm(msg))
    {
        lock (formListLock) { formList.Add(form); }
        form.ShowDialog();
        lock (formListLock) { formList.Remove(form); }
    }
}

This was just off the top of my head but might be another possible direction you could take.

You will have to make a thread safe call to form.Close() so that it is run on the form's UI thread. Read about invoke here. There's a lot of information on SO about this topic. This could be as simple as adding something like the following method to your form class:

public void ThreadSafeClose()
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action(Close));  /// or BeginInvoke...
    }
    else
    {
        Close();
    }
}

Read more about Lists here: https://msdn.microsoft.com/en-us/library/6sh2ey19%28v=vs.110%29.aspx

Read more about the lock statement here: https://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

Read more about thread synchronisation here: https://msdn.microsoft.com/en-us/library/ms173179.aspx

There are also numerous thread-safe collections that could possibly suit your needs, e.g. ConcurrentBag.



来源:https://stackoverflow.com/questions/35471376/close-messagebox-when-incoming-new-message

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!