2013-07-09 1 views
4

я много информации в этом вопросе, потому что я понятия не имею, что будет relaventWPF C# приложение будет замерзать весь мой компьютер когда-либо в 2-3 раза я бегу это

Выпуск:
Я имею проблема с программой, над которой я работаю, когда ее запускает, она закроет весь мой компьютер и не вернет ошибку (я совершенно неспособен делать что-то, что CTRL + ALT + DEL даже не работает). Эта программа принимает соединение от клиента android и atm клиент Android не настроен правильно, поэтому соединение отклоняется.

Вопрос:
Как я могу остановить мою программу от замерзания всей моей машины?

ГИПОТЕЗА:
У меня есть несколько теорий относительно того, что происходит, но не знаю, как их исправить. Я прочитал, что это может иметь какое-то отношение ко мне, когда я запускаю однопоточный процесс внутри моего асинхронного рабочего, но я не уверен, что сокет - это однопоточный процесс. Также я не совсем уверен, как я должен иметь дело с исключениями в workworker, поэтому я просто позволяю ему возвращаться к RunWorkerCompletedEventArgs, а затем извлекает сообщение об ошибке оттуда.

То, что я пробовал:
- Я пытался ставить попытку улавливает, где каждый последующее удаление попытки не ловит ничего, кажется, чтобы быть в состоянии захватить эту ошибку
- Я проверил журнал системы событий и ничего не появляется, кроме моего перезагружается после моего компьютера замерзает
- я попытался изолировать проблему, но это может произойти буквально в любой момент из программы запуска до при попытке подключения

Установка:
Я РУННЫ в программе из visual studio 2012 Professional на Windows 8 pro machine. Компьютер, на котором я работаю, имеет i7-3770K 3,50 ГГц и 32 ГБ оперативной памяти. Приложение, пытающееся установить соединение с моим, - это приложение для Android, а учетные данные неверны, когда он пытается подключиться. Visual Studio отключает мой основной жесткий диск и создает проект на другом диске.

Закрытие:
Со всем, что сказал бы кто-нибудь, пожалуйста, готовы мне помочь? Если вам нужна дополнительная информация, я буду рад предоставить ее, пожалуйста, спросите.

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

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.ComponentModel; 

namespace Server 
{ 
/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class SourceServer : Window 
{ 
    private BackgroundWorker worker = new BackgroundWorker(); 

    public SourceServer() 
    { 
     InitializeComponent(); 

     StartListeningForConnections(); 
    } 

    private void StartListeningForConnections() 
    { 

     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
     worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged); 
     worker.WorkerReportsProgress = true; 

     if (worker.IsBusy != true) 
     { 
      worker.RunWorkerAsync(); 
     } 
    } 

    private void worker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     worker.ReportProgress(0, "Source server version 0.0.0.1ib started"); 
     LoginServer oLoginServer = new LoginServer(); 
     oLoginServer.StartListening(worker); 

    } 

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     try 
     { 
      lvOutput.Items.Add(e.UserState.ToString()); 
     } 
     catch (Exception exception) 
     { 
      lvOutput.Items.Add(exception.StackTrace); 
     } 
    } 

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     if (e.Error != null) 
     { 
      System.IO.File.WriteAllText(Environment.CurrentDirectory + @"\log.txt", e.Error.StackTrace + " /n " + e.Error.Message); 
     } 
     else 
     { 
      MessageBox.Show("Error was null"); 
     } 
     worker.Dispose(); 
    } 
} 
} 

SSL Разъем соединения:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Threading; 
using System.Net; 
using System.Net.Sockets; 
using System.Windows; 
using System.Windows.Controls; 
using System.ComponentModel; 
using System.Net.Security; 
using System.Security.Cryptography.X509Certificates; 
using MySql.Data.MySqlClient; 
using System.IO; 

namespace Server 
{ 
public class LoginServer 
{ 
    // Incoming data from the client. 
    public static string data = null; 
    public static X509Certificate serverCertificate = null; 

    public delegate void UpdateListView(ListView oOutput); 

    public void StartListening(BackgroundWorker worker) 
    { 
     // Data buffer for incoming data. 
     byte[] bytes = new Byte[1024]; 

     // Establish the local endpoint for the socket. 
     IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName()); 
     IPAddress ipAddress = ipHostInfo.AddressList[1]; 

     serverCertificate = X509Certificate.CreateFromCertFile(@"server.crt"); 
     TcpListener oServer = new TcpListener(ipAddress, 12345); 


     // Bind the socket to the local endpoint and 
     // listen for incoming connections. 

     // Start listening for connections. 
     while (true) 
     { 
      Thread.Sleep(100); 
      worker.ReportProgress(0, "Waiting for connection...."); 

      // Program is suspended while waiting for an incoming connection. 
      //Socket handler = listener.Accept(); 
      oServer.Start(); 
      TcpClient oClient = oServer.AcceptTcpClient(); 
      Stream oStream = oClient.GetStream(); 
      SslStream oSSLStream = new SslStream(oStream); 

      data = null; 

      // An incoming connection needs to be processed. 
      string sUsername = "place holder"; 
      string sPassword = "place holder"; 

      while (true) 
      { 
       bytes = new byte[1024]; 
       int bytesRec = oSSLStream.Read(bytes, 0, bytes.Length); 
       data += Encoding.ASCII.GetString(bytes, 0, bytesRec); 

       string[] sCredentials = data.Split("|".ToCharArray()[0]); 

       sUsername = sCredentials[0]; 
       sPassword = sCredentials[1]; 

       if (data.IndexOf("<EOF>") > -1) 
       { 
        break; 
       } 
      } 

      // Show the data on the console. 
      worker.ReportProgress(0, "Connection Recieved : "); 
      worker.ReportProgress(0, "Username: " + sUsername); 
      worker.ReportProgress(0, "Password: " + sPassword); 
      worker.ReportProgress(0, ""); 

      // Echo the data back to the client. 
      byte[] msg; 
      if (sUsername.Equals("test") && sPassword.Equals("test")) 
      { 
       msg = Encoding.ASCII.GetBytes("approved<EOF>\n"); 
       worker.ReportProgress(0, "approved"); 
       oSSLStream.Write(msg, 0, msg.Length); 
      } 
      else 
      { 
       msg = Encoding.ASCII.GetBytes("rejected<EOF>\n"); 
       worker.ReportProgress(0, "rejected"); 
       oSSLStream.Write(msg, 0, msg.Length); 
      } 
     } 
    } 

    public void VerifyUser() 
    { 

    } 
} 
} 

ответ

2

Пока я не вижу никаких оснований для этого, чтобы запереть весь компьютер, я вижу пара причин, по которым приложение потенциально зависает ...

Ваш цикл while внутри вашего S Сервер SL никогда не будет ломаться, если ваш клиент не напишет

'<EOF>'
в поток; которые вы должны были бы заставить его делать.Я, вероятно, сделать что-то похожее на это:

while((bytesRec = oSSLStream.Read(bytes,0,bytes.Length)) > 0) 
{ 
    // Compare input & break 
} 

- время цикла у вас есть сейчас (без сна потока) будет потреблять все ваши системы ресурсов ждет ... что-то, что никогда не может произойти.

В связанной проблеме - я отмечаю, что ваш метод DoWork запускает слушателя, но не запускает новый поток для этого слушателя. Это означает, что слушатель работает внутри вашего потока интерфейса, что приведет к зависанию интерфейса (и потенциально большего количества) ... до тех пор, пока процесс не будет завершен, что, как указано, может и не произойти.

... Ahem ... Этот последний абзац может быть неправильным - вы работаете с асинхронным рабочим, поэтому я могу быть неверным во второй оценке.

Приветствия, надеюсь, это полезно.

+0

Спасибо, что я сделал это изменение в моем цикле while, но мой компьютер все равно полностью закроется после запуска его пару раз. –

+1

Сделайте мне одолжение и добавьте Thread.Sleep к этому циклу - только ради здравого смысла - и посмотрите, все ли он блокируется ... – DigitalJedi805

+1

Следующим моим самым лучшим предложением было бы создать метод, который открывается, добавляет, сбрасывает и закрывает файл журнала - и на столько же времени, сколько вы можете обнажить - добавьте сообщение журнала; просто отслеживать, насколько далеко вы достигли своего исполнения. – DigitalJedi805

0

У меня были проблемы с зависанием в Windows 8, которые я никогда не видел в Windows 7 (с VS2012). По мере того как вы испытали это работало отлично в первый раз, но только заперли Visual Studio (а не всю мою машину), и я должен был заставить бросить курить.

Visual Studio 2012 Update 4 (в котором основное внимание уделяется исправлениям ошибок и совместимости), казалось, исправить это, хотя я не научно это испытал.

Примечание: По состоянию на 9/1/13 это только версия RC2, поэтому, пожалуйста, проверьте новые версии и отредактируйте этот ответ, когда произойдет RTM.