1

winform アプリケーションで servicestack サーバーをセルフホストする必要があり、フォーム要素とグローバル変数にアクセスする正しい方法を知りたいです。Run メソッドで Main を参照して、メイン フォームの AccessCount、UpdateLog、LogBox.Text にアクセスして変更するにはどうすればよいですか?

これは私の基本的な作業サンプルです:

namespace Test
{    
    public partial class Main : Form
    {
        private static readonly string ListeningOn = ConfigUtils.GetAppSetting("ListeningOn"); 

                    public int AccessCount;


        public Main()
        {
            InitializeComponent();

            var appHost = new AppHost();
            appHost.Init();
            appHost.Start(ListeningOn);

            UpdateLog("Started listening on: ");

            UpdateLog(string.Format("AppHost Created at {0}, listening on {1}", DateTime.Now, ListeningOn)); 


        }

        public void UpdateLog(string data)
        {
            LogBox.Text +=  DateTime.Now.ToString("hh:mm:ss:fff") + " - " + data + "\n";
        }

        public class AppHost : AppHostHttpListenerBase
        {

            public AppHost() : base("StarterTemplate HttpListener", typeof(HelloService).Assembly) { }


            public override void Configure(Funq.Container container)
            {

            }
        }
    }

    [Description("ServiceStack's Hello World web service.")]
    [Route("/hello")]
    [Route("/hello/{Name*}")]
    public class Hello : IReturn<HelloResponse>
    {
        public string Name { get; set; }
    }

    public class HelloResponse : IHasResponseStatus
    {
        public string Result { get; set; }
        public ResponseStatus ResponseStatus { get; set; }
    }

    public class HelloService : ServiceBase<Hello>
    {
        protected override object Run(Hello request)
        {
                            // HOWTO reference Main to access and modify AccessCount, UpdateLog, LogBox.Text in the main form?


            return new HelloResponse { Result = "Hello, " + request.Name };
        }
    }
}

ありがとう!

4

1 に答える 1

2

私はWinFormsの実際の経験がないので、開いているWindowsをループしてメソッドを呼び出すという私の解決策は、現実的な解決策ではないかもしれません。少なくとも、面白いと思います。他にもいくつか変更を加えました。

  • HelloServiceをServiceから継承させました(新しいApi)
  • あなたのRunメソッドは保護されていました、私はそれを公開し、Any()に変更しました

コード:

public partial class Main : Form
{
    private static readonly string ListeningOn = "http://*:1337/";
    public int AccessCount;

    public Main()
    {
        InitializeComponent();

        var appHost = new AppHost();
        appHost.Init();
        appHost.Start(ListeningOn);
        UpdateLog("Started listening on: ");

        UpdateLog(string.Format("AppHost Created at {0}, listening on {1}", DateTime.Now, ListeningOn)); 
    }

    public void UpdateLog(string data)
    {
        LogBox.Text +=  DateTime.Now.ToString("hh:mm:ss:fff") + " - " + data + "\n";
    }

}

public class AppHost : AppHostHttpListenerBase
{
    public AppHost() : base("StarterTemplate HttpListener", typeof(AppHost).Assembly) { }

    public override void Configure(Funq.Container container)
    {

    }
}

[Description("ServiceStack's Hello World web service.")]
[Route("/hello")]
[Route("/hello/{Name*}")]
public class Hello : IReturn<HelloResponse>
{
    public string Name { get; set; }
}

public class HelloResponse : IHasResponseStatus
{
    public string Result { get; set; }
    public ResponseStatus ResponseStatus { get; set; }
}

public class HelloService : Service
{
    public object Any(Hello request)
    {
        // HOWTO reference Main to access and modify AccessCount, UpdateLog, LogBox.Text in the main form?
        foreach(var fm in Application.OpenForms)
        {
            if (((Form)fm).Name == "Main") //Find the form by name
            {
                ((Main) fm).Invoke(new Action<Form, string>(UpdateLog), fm, request.Name); //Can only make changes to WinFrom controls from master thread so 'delegating' method back to form
            }
        }
        return new HelloResponse { Result = "Hello, " + request.Name };
    }

    public void UpdateLog(Form fm, string name)
    {
        ((Main)fm).AccessCount++;
        ((Main)fm).UpdateLog(name);
    }
}
于 2013-03-08T16:57:40.070 に答える