私の以前の投稿に関して:910220- コードとそれに関する問題について私が意味したことは少し複雑だったので、サービスメソッドは依存して実行されます、私はそれ自体をよりよく説明する完全に変更されたコードで再び来ます。
クライアント側では、次のようになります。
#define USE_ONLY_ONE_INSTANCE
using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using CountTester.ServiceReference1;
namespace CountTester
{
public partial class MainPage : UserControl
{
#if USE_ONLY_ONE_INSTANCE
private readonly Service1Client _sc = new Service1Client();
#endif
public MainPage()
{
InitializeComponent();
#if USE_ONLY_ONE_INSTANCE
_sc.CountCompleted += OnCountCompleted;
#endif
}
void OnCountCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
throw new Exception(string.Format("Count Error {0}", e.Error));
}
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
for (int i = 0; i < 100; i++)
{
#if USE_ONLY_ONE_INSTANCE
_sc.CountAsync(i);
#else
var sc = new Service1Client();
sc.CountCompleted += OnCountCompleted;
sc.CountAsync(i);
//sc.CloseAsync();
#endif
}
}
}
}
これはXAMLの背後にあるコードです。コードでは、サービスメソッドを100回呼び出します。両方のケースを試しましたが、両方のケースで例外が発生しました。ケース1:サーバーとのすべての通信にプロキシのインスタンスを1つだけ使用します。ケース2:サーバーとの通信ごとにインスタンスを使用します。
詳細を説明する前に、サーバーのコードを見てみましょう。
using System.IO;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.Text;
using System.Threading;
namespace CountTester.Web
{
[ServiceContract(Namespace = "")]
[SilverlightFaultBehavior]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
const string logFileName = @"h:\CountTester.log";
object _logLock = new object();
void log(string s)
{
lock (_logLock)
{
var streamWriter = new StreamWriter(logFileName, true, Encoding.ASCII);
streamWriter.Write(s);
streamWriter.Close();
}
}
Service1()
{
//File.Delete(logFileName);
}
[OperationContract]
public void Count(int counter)
{
log(string.Format("{0}\n", counter));
Thread.Sleep(3000);
}
}
}
Countは、呼び出されるサービスメソッドです。メソッドで意図的に3秒待ちます。私が期待しているのは、クライアントでのforが遅滞なく達成されることです。メソッドが非同期的に呼び出されることを期待しています。これは、最初の呼び出しが2番目の呼び出しに影響を与えないことを意味します。
言い換えると、メソッドを呼び出して、それが完了するのを待っている場合、それを再度呼び出すのが遅れることはありません。
これが事実ですが。これが発生することをどのように理解できますか?Tail for Windowsを使用すると、ログに記録される番号がログに記録されるのが遅れることがわかります。また、サービスメソッドの呼び出しに応答してタイムアウト例外が発生するのを確認すると、これがわかります(カウントエラー...)。私の質問を明確にできればと思います。
また、サービスを閉じた行のコメントを外すと、プログラムの誤動作(例外)が発生するのではないかと思います。
これらの2つの質問に答えてください。