更新:我想,我需要了解在WPF中应用程序启动之前显示对话框的"正确","支持"方式是什么.
这是代码:
public partial class App : Application
{
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();
new DialogWindow().ShowDialog();
app.Run( new MainWindow() );
}
}
Run Code Online (Sandbox Code Playgroud)
该DialogWindow显示为预期.
但关闭后,应用程序立即退出.MainWindow根本不显示!
我做了一些调试并将问题追溯到:
appMainWindow,因为此时没有MainWindow.ShutdownCallback在调度程序队列上发布.app.Run被调用,队列中的第一件事就是ShutdownCallback,这自然会导致应用程序立即关闭.鉴于这一分析,有一个明显的解决办法:建立MainWindow之后App,从而使得它app的主窗口,这将防止DialogWindow从导致应用程序关闭.
然而,这是困扰我的.
首先,这看起来像是一个肮脏的黑客.我的意思是,没有明确的理由按此顺序创建窗口,我只通过一些调试找到了这个.这不是受支持的方式.
其次,这显然是一个错误.我的意思是,如果在关闭后创建第二个窗口没有明确支持,它应该抛出一些InvalidOperationException,对吧?
第三,这不仅是一个错误,而且看起来像一个非常天真的错误,就像多线程初学者会创造的那样.
所有这些让我相信,也许我没有得到一些基本的东西?也许我根本没有意义?也许这一切都应该以某种不同的方式完成?
这里有一些背景知识:
应用程序必须在启动时进行一些引导.检查这一点,设置异常处理程序,记录 - 你知道,通常的东西.在此过程中,可能需要向用户请求帮助 - 这是对话框的用途.
我绝对不想把所有这些都放在某种执行的状态机上MainWindow.IsVisibleChanged或类似的东西上.我想保持它非常简单,简洁和直接 - 引导代码应该是这样的方式,这样就可以很容易地用肉眼发现错误.
我试图使用http://msdn.microsoft.com/en-us/library/dd456783(v=VS.100).aspx作为起点在WCF中使用发现功能.它在我的机器上工作正常,但后来我想在另一台机器上运行该服务.该服务被正确发现,但找到的服务的主机名始终是"localhost",当然没什么用处.
var endpointAddress = new EndpointAddress(new UriBuilder { Scheme = Uri.UriSchemeNetTcp, Port = port}.Uri);
var endpoint = new ServiceEndpoint(ContractDescription.GetContract(typeof(IServiceInterface)), new NetTcpBinding (), endpointAddress);
Run Code Online (Sandbox Code Playgroud)
static EndpointAddress FindServiceAddress<T>()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
DiscoveryClient discoveryClient = new DiscoveryClient(new UdpDiscoveryEndpoint());
// Find endpoints
FindResponse findResponse = discoveryClient.Find(new FindCriteria(typeof(T)));
Console.WriteLine(string.Format("Searched for {0} seconds. Found {1} Endpoint(s).",stopwatch.ElapsedMilliseconds / 1000,findResponse.Endpoints.Count));
if (findResponse.Endpoints.Count > 0)
{
return findResponse.Endpoints[0].Address;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我应该简单地将主机设置为System.Environment.MachineName吗?