2012-05-17 55 views
4

我想要显示一个消息框并且程序只是继续,而不是等待我在此消息框上单击确定。可以做到吗?允许进程自动继续的MessageBox

else 
{ 
    // Debug or messagebox the line that fails 
    MessageBox.Show("Cols:" + _columns.Length.ToString() + " Line: " + lines[i]); 

} 

回答

3

首先,正确的解决方案是用普通窗口(或表单,如果您使用winforms)替换消息框。那会很简单。示例(WPF)

<Window x:Class="local:MyWindow" ...> 
    <Grid> 
     <TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" 
        Text="{Binding}" /> 
     <Button HorizontalAlignment="Right" VerticalAlignment="Bottom" 
        Click="SelfClose">Close</Button> 
    </Grid> 
</Window> 

... 
class MyWindow : Window 
{ 
    public MyWindow(string message) { this.DataContext = message; } 
    void SelfClose(object sender, RoutedEventArgs e) { this.Close(); } 
} 

... 
new MyWindow("Cols:" + _columns.Length.ToString() + " Line: " + lines[i]).Show(); 

如果你想快速和肮脏的解决方案,你可以调用从暴殄天物线程的消息框:

Thread t = new Thread(() => MessageBox("lalalalala")); 
t.SetApartmentState(ApartmentState.STA); 
t.Start(); 

(不知道ApartmentState.STA实际需要)

1

你需要使用多线程来实现这一任务,其中一个线程(主线程)会做加工等将被用于显示消息框。

2

使用本

this.Dispatcher.BeginInvoke(new Action(() => { MessageBox.Show(this, "text"); })); 

希望它能帮助。

+0

给予好评的1个班轮 – KingCronus

+0

错误:这将阻止对_next_消息循环迭代的UI。 OP希望消息框完全异步。 – Vlad

2
using System.Threading;  

static void MessageThread() 
{ 
    MessageBox.Show("Cols:" + _columns.Length.ToString() + " Line: " + lines[i]); 
} 

static void MyProgram() 
{ 
    Thread t = new Thread(new ThreadStart(MessageThread)); 
    t.Start(); 
} 

这将启动MessageThread功能在它自己的线程,这样你的代码在我所谓MyProgram其余的可以继续。

希望这会有所帮助。

2

你想要什么是无模式的形式。这里有一些infosamples给你。

4
//You need to add this if you don't already have it 

using System.Threading.Tasks; 

//然后这里是你的代码,将运行主线程的异步;

Task.Factory.StartNew(() => 
{ 
    MessageBox.Show("This is a message"); 

}); 
1

你也可以考虑使用委托。

以下snippits来自财产以后我刚刚完成: -

namespace YourApp 
{ 
    public partial class frmMain : Form 
    { 
    // Declare delegate for summary box, frees main thread from dreaded OK click 
    private delegate void ShowSummaryDelegate(); 
    ShowSummaryDelegate ShowSummary; 

    /// <summary> 
    /// Your message box, edit as needed 
    /// </summary> 
    private void fxnShowSummary() 
    { 
     string msg; 

     msg = "TEST SEQUENCE COMPLETE\r\n\r\n"; 
     msg += "Number of tests performed: " + lblTestCount.Text + Environment.NewLine; 
     msg += "Number of false positives: " + lblFalsePve.Text + Environment.NewLine; 
     msg += "Number of false negatives: " + lblFalseNve.Text + Environment.NewLine; 

     MessageBox.Show(msg); 
    } 



    /// <summary> 
    /// This callback is used to cleanup the invokation of the summary delegate. 
    /// </summary> 
    private void fxnShowSummaryCallback(IAsyncResult ar) 
    { 
     try 
     { 
     ShowSummary.EndInvoke(ar); 
     } 
     catch 
     { 
     } 
    } 

    /// <summary> 
    /// Your bit of code that wants to call a message box 
    /// </summary> 
    private void tmrAction_Tick(object sender, EventArgs e) 
    { 
     ShowSummary = new ShowSummaryDelegate(fxnShowSummary); 
     AsyncCallback SummaryCallback = new AsyncCallback(fxnShowSummaryCallback); 
     IAsyncResult SummaryResult = ShowSummary.BeginInvoke(SummaryCallback, null); 
    } 

    // End of Main Class 
    } 
} 
相关问题