Многопоточное приложение не работает в Windows 7

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

EDIT: В CallMethod() я вызываю WCF и жду ответа. Кажется, что вызов 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;}

}

person Feder Catalin    schedule 28.05.2012    source источник
comment
Предположим, что txtResult.InvokeRequired имеет значение false... Ничего не происходит   -  person spender    schedule 28.05.2012


Ответы (3)


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

person Malcolm    schedule 28.05.2012

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

person Feder Catalin    schedule 29.05.2012

Пример работы на машине 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);
    }
person Ali Yıldız    schedule 28.05.2012
comment
Почти в каждом значительно большом приложении есть потоки. вы можете вставить любой из них и объявить его ответом... За исключением того, что он не отвечает на этот конкретный вопрос. В простейшем случае пример многопоточного кода может состоять примерно из 5 строк. Хотя даже это не ответит на вопрос - person spender; 28.05.2012
comment
Да, вы правы, это не ответ, а образец. Другое дело, это мой код. - person Ali Yıldız; 28.05.2012