8

次のコードは、最初にパラメーターを送信する名前付きパイプ クライアントとして機能し、次に結果を取得するサーバーとして機能する新しいスレッドを作成します。その後、名前付きパイプ サーバーとして機能する別の AppDomain で関数を実行し、その後クライアントとして結果を送信します。

public OrderPrice DoAction()
{
  Task<OrderPrice> t = Task<OrderPrice>.Factory.StartNew(NamedPipeClient, parameters);

  if (domain == null)
  {
    domain = AppDomain.CreateDomain(DOMAINNAME);
  }
  domain.DoCallBack(AppDomainCallback);

  return t.Result;
}

static OrderPrice NamedPipeClient(object parameters) {
  OrderPrice price = null;

  using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_TO)) {
    stream.Connect();
    SerializeToStream(stream, parameters);
  }

  using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_BACK)) {
    stream.WaitForConnection();

    price = (OrderPrice)DeserializeFromStream(stream);
  }

  return price;
}

void AppDomainCallback() {
  OrderPrice price = null;

  using (NamedPipeServerStream stream = new NamedPipeServerStream(PIPE_TO)) {
    stream.WaitForConnection();

    List<object> parameters = (List<object>)DeserializeFromStream(stream);

    if (mi != null)
      price = (OrderPrice)mi.Invoke(action, parameters.ToArray());
}

  using (NamedPipeClientStream stream = new NamedPipeClientStream(PIPE_BACK)) {
    stream.Connect();
    SerializeToStream(stream, price);
  }
}

コードは平均して 1 秒に 1 回呼び出され、7 時間以上正常に動作しました。しかし、ある時点で「system.io.ioexception all pipe instances are busy」がスローされ、その後再接続されなくなります。ここを参照すると、パイプ オブジェクトが適切に配置されていないことが原因のように見えますが、それらは using ステートメント内にあるため、問題はないと思います。ここで何が間違っているのか、誰にも手がかりがありますか? コードは、Windows サーバー 2008 で実行されている .NET 4.0 にあります。

4

1 に答える 1

2

mutex単純なロックではなく、

ロック、ミューテックス、セマフォ...違いは何ですか?

時折停止する限り、それは飢餓またはデッドロックである可能性があります。

これは、何が起こっているのかについての要約のための良い読み物です

http://en.wikipedia.org/wiki/Dining_philosophers_problem

于 2013-08-27T13:31:25.307 に答える