1

Windowsフォームアプリを作ろうとしています。アプリはマルチスレッドを使用し、各スレッドはメソッドを呼び出し、メイン スレッドで作成されたコントロールを更新します。Invoke を使用してコントロールを更新すると、アプリは Windows サーバー エンタープライズで動作しますが、Windows 7 64 ビットでは動作しません。Windows 7 では、インターフェースを 2 回更新した後、アプリケーションは何もしなくなります。何が問題なのかわかりません。複数のスレッドとタスク(Task.Factory.StartNew())を試してみましたが、同じ結果が得られました(コントロールを2回更新します)。エラー メッセージはありません。ありがとうございました。

編集:CallMethod()私はWCFを呼び出して、応答を待っています 。WCF呼び出しは最初の2つのスレッドで何かを返しているようですが、残りはそうではありません...

コード:

主な方法:

            for (int i = 0; i < NoThreads; i++)
            {
                int index = i;
                Thread t = new Thread(CallMethod);
                t.Name = "Thread [" + Cicle + "] Cicle [" + i + "]";
                threads[i] = t;

            }
            for (int i = 0; i < NoThreads; i++)
            {
                threads[i].Start();
            }

呼び出し方法:

private string CallMethod()
{
 try
   {
      //calling a webservice

      string message = .....
      if (txtResult.InvokeRequired)
      { txtResult.Invoke((MethodInvoker)(() => txtResult.AppendText(message))); }
 catch
 {throw;}

}
4

3 に答える 3

0

問題が解決 しました各スレッドでWCFを呼び出した後、接続を閉じる必要がありました

于 2012-05-29T09:48:16.357 に答える
0

デバッグの場合は、CallMethod() を介したすべてのパスが UI を更新していることを確認してください (「この時点に到達しました」というテキストだけであっても)。txtResult.InvokeRequired が false であるか、Web リクエストから例外が発生している可能性があります。

于 2012-05-28T15:35:01.167 に答える
-1

スレッド用の x64 マシン (Windows 7) での作業のサンプル:

class Server
{
    private TcpListener tcpListener;
    private Thread listenThread;
    private static string rootPath = "";
    public Server()
    {
        IPAddress ipAddress = Dns.Resolve("localhost").AddressList[0];
        this.tcpListener = new TcpListener(ipAddress, 9501);
        //this.tcpListener = new TcpListener(RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        Trace.WriteLine("Server Working", "Information");
        this.listenThread.Start();
    }


    private void ListenForClients()
    {
        this.tcpListener.Start();
        Trace.WriteLine("Server TcpListener Started", "Information");
        while (true)
        {
            //blocks until a client has connected to the server
            TcpClient client = this.tcpListener.AcceptTcpClient();
            Trace.WriteLine("Server TcpListener New Client", "Information");
            // create a thread to handle the client
            //ParameterizedThreadStart HandleClientConn;
            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        Trace.WriteLine("Server TcpListener New Client Handle Thread", "Information");
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream nStream = tcpClient.GetStream();
        Image img = Image.FromStream(nStream);
        Trace.WriteLine("Server TcpListener Image is received", "Information");
        string imageName = client.GetHashCode() + ".jpg";
        string imagePath = Path.Combine(Environment.GetEnvironmentVariable("RoleRoot") + @"\", @"approot\"+ imageName);
        img.Save(imagePath, ImageFormat.Jpeg);
        rootPath = Environment.GetEnvironmentVariable("RoleRoot");
        Dictionary<string, string> templates = GetTemplates();
        string sDataDir = String.Format("{0}StasmData\\", rootPath);
        StasmHelper stasm = new StasmHelper();
        Face retVal = stasm.GetHumanFace(imagePath, sDataDir, templates);

        File.Delete(imagePath);
    }
于 2012-05-28T15:13:50.410 に答える