2012-05-28 4 views
1

Я пытаюсь создать приложение Windows Form. Приложение использует многопоточность, и каждый поток вызывает метод, и он обновляет элементы управления, созданные в основном потоке. Я использую invoke для обновления элементов управления, и приложение работает на сервере Windows, но оно присутствует на 64-разрядной версии Windows 7. В WIndows 7 приложение перестает делать что-либо после обновления интерфейса 2 раза. Я не знаю, какая проблема. Я пробовал с несколькими потоками и с задачей (Task.Factory.StartNew()), и у меня был тот же результат (обновляет контроль 2 раза). Нет сообщения об ошибке. Спасибо.Многопользовательское приложение, не работающее над окнами 7

EDIT: В CallMethod() я звоню WCF и ждет respont. Представляется, что WCF вызов возвращается что-то в течение первых двух потоков и для остальных это не ...

код:

Основной метод:

  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(); 
      } 

CallMethod:

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

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

} 
+0

Пред- полагая txtResult.InvokeRequired ложна ... Ничего не происходит – spender

ответ

-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); 
    } 
+0

Это не пример. Это просто глупо. – spender

+0

Почему spender? В этом коде есть использование потока. –

+0

Практически каждое значительное приложение имеет потоки. вы можете вставить любой из них и утверждать это как ответ ... Кроме того, он не отвечает на этот конкретный вопрос. В простейшем случае примером потокового кода может быть около 5 строк. Даже это не ответит на вопрос, хотя – spender

0

Для отладки убедитесь, что все пути через CallMethod() обновляют пользовательский интерфейс (даже если это просто текст «получил эту точку»). Кажется, что txtResult.InvokeRequired может быть ложным или, возможно, вы получаете исключение из веб-запроса.

0

Проблема решаемая мне пришлось закрыть соединение после вызова WCF в каждом потоке

Смежные вопросы