1

初めての WCF プログラムを作成しようとしています。それは非常に単純なはずですが、うまく機能させることができません。

これまでに行った手順:

  1. C# Windows フォーム アプリケーションを作成する
  2. ボタンの追加
  3. プロジェクトに WCF サービスを追加しました。
  4. これこのページのチュートリアルに従ってコードを変更しました。

IWCF.csコード:

using System;
...etc

namespace WCF_Application
{

    [ServiceContract]
    public interface IWCF
    {
        [OperationContract]
        string DoWork();
    }
}

WCF.csコード:

using System;
...

namespace WCF_Application
{

    public class WCF : IWCF
    {
        public string DoWork()
        {
            return " Hello There! ";
        }

    }
}

ボタンコード:

private void btnConnect_Click(object sender, EventArgs e)
        {
// Starting the Server

            ServiceHost svh = new ServiceHost(typeof(WCF));
            svh.AddServiceEndpoint(
                typeof(IWCF),
                new NetTcpBinding(),
                "net.tcp://localhost:8000");
            svh.Open();
            MessageBox.Show("Connected");

// Connecting Client to the server
            ChannelFactory<IWCF> scf;
            scf = new ChannelFactory<IWCF>(
                        new NetTcpBinding(),
                        "net.tcp://localhost:8000");

            IWCF s = scf.CreateChannel();
            string response = s.DoWork();
            MessageBox.Show(response);
            svh.Close();
}

応答メッセージが届きません。プログラムがフリーズします。コードをトレースすると、プログラムがそのstrong response = s.DoWork();行でスタックします。

netstat -a私もcmdでチェックしました。ポート 8000 がリッスン モードで開いているようです。したがって、問題はクライアント部分にあるはずです。

OS Windows 7 / VS 2010 / C#

4

1 に答える 1

3

WCF サービスが UI と同じスレッドでホストされているため、ここでデッドロックの問題が発生しています。別のスレッドでサービスをホストするには、次のことを試すことができます。

[ServiceBehavior(UseSynchronizationContext = false)]
public class WCF : IWCF
{
    public string DoWork()
    {
        return " Hello There! ";
    }
}

WPF スレッド モデルUseSynchronizationContextの背景を次に示します。別の方法として、サービスへのクライアント呼び出しをスレッド化することもできますが、それには他の UI 更新の影響もある可能性があります。

于 2013-02-24T16:03:34.863 に答える