相关疑难解决方法(0)

启动前显示对话框时,WPF应用程序立即退出

更新:我想,我需要了解在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根本不显示!

我做了一些调试并将问题追溯到:

  1. 创建对话框后,它变为appMainWindow,因为此时没有MainWindow.
  2. 因此,关闭对话框会导致应用程序ShutdownCallback在调度程序队列上发布.
  3. 但是,调度程序运行时间不足以执行回调.
  4. 因此,一旦app.Run被调用,队列中的第一件事就是ShutdownCallback,这自然会导致应用程序立即关闭.

鉴于这一分析,有一个明显的解决办法:建立MainWindow之后App,从而使得它app的主窗口,这将防止DialogWindow从导致应用程序关闭.

然而,这是困扰我的.

首先,这看起来像是一个肮脏的黑客.我的意思是,没有明确的理由按此顺序创建窗口,我只通过一些调试找到了这个.这不是受支持的方式.

其次,这显然是一个错误.我的意思是,如果在关闭后创建第二个窗口没有明确支持,它应该抛出一些InvalidOperationException,对吧?

第三,这不仅是一个错误,而且看起来像一个非常天真的错误,就像多线程初学者会创造的那样.

所有这些让我相信,也许我没有得到一些基本的东西?也许我根本没有意义?也许这一切都应该以某种不同的方式完成?

这里有一些背景知识:
应用程序必须在启动时进行一些引导.检查这一点,设置异常处理程序,记录 - 你知道,通常的东西.在此过程中,可能需要向用户请求帮助 - 这是对话框的用途.

我绝对不想把所有这些都放在某种执行的状态机上MainWindow.IsVisibleChanged或类似的东西上.我想保持它非常简单,简洁和直接 - 引导代码应该是这样的方式,这样就可以很容易地用肉眼发现错误.

c# wpf modal-dialog c#-4.0

21
推荐指数
2
解决办法
2万
查看次数

WCF发现找到端点但主机是"localhost"

我试图使用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吗?

c# wcf service-discovery

4
推荐指数
2
解决办法
3236
查看次数

标签 统计

c# ×2

c#-4.0 ×1

modal-dialog ×1

service-discovery ×1

wcf ×1

wpf ×1