2014-04-05 3 views
2

Я создаю веб-приложение C# с использованием Silverlight 5 (VS 2010). Сначала я создал консольное приложение, в котором все работает нормально. Но проблема возникает, когда я делаю это в веб-приложении.Generics <T> не работает в C# даже без ошибок

Даже в веб-приложении он отлично работает для особо заданного типа данных (например, для int вместо <T> он работает нормально), но когда я использую generic, то он не работает. Он компилирует ошибку, но она даже не отлаживает область, которая настроена на «переключение точки останова». Первоначально GUI было так:

enter image description here

Но поскольку управление переходит к ошибке склонной части, графический интерфейс внезапно исчезает, как этот

enter image description here

и место, где я держал перерыв точки заменяется этим

enter image description here

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

Некоторые объяснения, что я пытаюсь сделать: в данном коде ниже У меня есть двоичный файл и хранится внутри «fileContents», который имеет тип byte[] данных (я не раскрывать вам метод, чтобы прочитать, что файл, на данный момент вы можете считать, что fileContents содержит содержимое двоичного файла внутри класса MainPage). На самом деле я буду хранить символы (формы 0 и 1 в двоичном файле) и найду его частоту (путем подсчета количества повторений в файле, но это не проблема, поэтому я не пишу для этого метод). Но это processingValue переменная в моем коде будет родового типа (<T>), который я буду хранить в "symbol" (который является также <T> типа (этот символ чтения из двоичного файла может быть один из них short/int/long/UInt32/UInt64 и т.д. .), которые я не показываю в своем коде).

У меня есть сценарий вроде этого:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.IO; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 
namespace 
{ 
    public partial class MainPage: UserControl 
    { 
     byte[] fileContent; 
     public MainPage() 
     { 
      InitializeComponent(); 
      fileContent = null; //Suppose it already contains binary fileContents 
     } 
//I press the button in order to call the Huffman class because it's Object declared in it 
     public void ButtonClickEvent(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("check0"); 

      //Suppose i had stored contents of a file inside "fileContent" , so fileContent below contains 
      //contents of a binary file 
      //**THE LINE BELOW IS ERROR PRONE** 
      Huffman <uint> obj1 = new Huffman <uint> (this, fileContent, BitConverter.ToUInt32); 

      //This Object creation creates problem, whereas if i remove generic type (<T>), Then it works fine. 
      //If i don't use genrics then i do it like this : Huffman obj1 = new Huffman(this, fileContent); (Whereas <T> in Huffman class is replaced by "int" and it works fine) 

      MessageBox.Show("check1"); //This check box is never executed 
     } 
    } 

    public class Huffman <T> where T: struct,IComparable <T> ,IEquatable <T> 
    { 
     public Huffman(MainPage Object, byte[] fileContent, Func < byte[], int, T > converter) 
     { 
      MessageBox.Show("check2"); //It never executes   
      length = fileContent.Length; 
      size = Marshal.SizeOf(typeof (T)); 
      byte[] data; 
      for (long position = 0; position + size < length; position += size) 
      { 
       data = fileContent; //This data conatains the filecontents now 
       T processingValue = converter(data, 0); 
       { 
        //I do something here with processingValue it could be int16/int32/int64/uin32/uint64 etc. 
       } 
      } 
     } 
    } 
} 

Есть ли какие-либо проблемы в BitConverter функции в создании объекта в классе MainPage?

Я даже не могу отлаживать класс Хаффмана, я устанавливаю точки останова на начальной и конечной точках класса Хаффмана, но элемент управления не входит внутрь, а кнопки (созданные с использованием графического интерфейса XAML) в Internet Explorer исчезают ,

Вот мой полный код: (пожалуйста, обратите внимание, я читаю двоичный файл (любой файл с расширением «.o» (FileName.o) canbe принято для тестирования моего кода, я хорошо читать)):

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.IO; 
using System.Text; 
using System.Runtime.InteropServices; 
using System.Diagnostics; 

namespace FinalSS 
{ 
    public partial class MainPage : UserControl 
    { 
     public const int CHUNK_SIZE = 4096; 
     public const string UPLOAD_URI = "http://localhost:50323/FileUpload.ashx?filename={0}&append={1}"; 
     public const string UPLOAD_DIALOG_FILTER = "All files (*.*)|*.*|Jpeg Images (*.jpg)|*.png|PNG Images (*.png)|*.png"; 
     private Stream data; 
     private string fileName; 
     private long TotalBytes; 
     private long UploadedBytes; 
     byte[] fileContent; 
     public event Action simpleEvent; 

     public MainPage() 
     { 
      InitializeComponent(); 
      progressBar.Visibility = Visibility.Collapsed; 
      textBox.Visibility = Visibility.Collapsed; 
      // fileContent = null; 
      UploadedBytes = 0; 
      TotalBytes = 0;      
     } 
    /* public void comboInvoke() 
     { 
      comboBox1.Items.Add("byte"); 
      comboBox1.Items.Add("sbyte"); 
      comboBox1.Items.Add("short"); 
      comboBox1.Items.Add("int"); 
      comboBox1.Items.Add("long"); 
     } */ 


     public void BrowseButtonClick(object sender, RoutedEventArgs e) 
     { OpenFileDialog dlg = new OpenFileDialog(); 
      dlg.Multiselect = false; 
      dlg.Filter = UPLOAD_DIALOG_FILTER; 
      bool? retVal = dlg.ShowDialog(); 

      if (retVal != null && retVal == true) 
      { 
       progressBar.Visibility = Visibility.Visible; 
       textBox.Visibility = Visibility.Visible; 
       textBox.Text = "Uploading the file..."; 

       data = dlg.File.OpenRead(); 
       TotalBytes = data.Length; 
       UploadedBytes = 0; 
       fileName = dlg.File.Name; 
       progressBar.Maximum = TotalBytes; 
       UploadFileChunk(); 
      }    
     } 

     private void UploadFileChunk() 
     { 
      textBox.Text = "Upload in progress..."; 
      string uploadUri = ""; 
      if (UploadedBytes == 0) 
      { 
       uploadUri = String.Format(UPLOAD_URI, fileName, 0); // Dont't append 
      } 
      else if (UploadedBytes < TotalBytes) 
      { 
       uploadUri = String.Format(UPLOAD_URI, fileName, 1); // append 
      } 
      else 
      { 
       return; // Upload finished 
      } 

      fileContent = new byte[CHUNK_SIZE]; 
      int bytesRead = data.Read(fileContent, 0, CHUNK_SIZE); 
      data.Flush(); 

      WebClient wc = new WebClient(); 
      wc.OpenWriteCompleted += new OpenWriteCompletedEventHandler(wc_OpenWriteCompleted); 
      Uri u = new Uri(uploadUri); 
      wc.OpenWriteAsync(u, null, new object[] { fileContent, bytesRead }); 
      UploadedBytes += fileContent.Length; 
      MessageBox.Show("check0"); 
      Huffman<uint> obj1 = new Huffman<uint>(this, fileContent, BitConverter.ToUInt32); 
      MessageBox.Show("check1"); 
     } 
     void wc_OpenWriteCompleted(object sender, OpenWriteCompletedEventArgs e) 
     { 
      progressBar.Value = UploadedBytes; 
      if (e.Error == null) 
      { 
       object[] objArr = e.UserState as object[]; 
       byte[] fileContent = objArr[0] as byte[]; 
       int bytesRead = Convert.ToInt32(objArr[1]); 
       Stream outputStream = e.Result; 
       outputStream.Write(fileContent, 0, bytesRead); 
       outputStream.Close(); 

       if (UploadedBytes < TotalBytes) 
       { 
        UploadFileChunk(); 
       } 
       else 
       { 
        textBox.Text = fileName; 
       } 
      } 

     } 
     /// <summary> 
     /// /////////////////////////////////////////////////////// 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 

     private void ShowButtonClick(object sender, RoutedEventArgs e) 
     { 
      if (simpleEvent != null) simpleEvent(); 
     } 

     private void CompressButtonClick(object sender, RoutedEventArgs e) 
     { 

     } 

     private void CloseButtonClick(object sender, RoutedEventArgs e) 
     { 

     } 

     private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

     } 

     private void textBox_TextChanged(object sender, TextChangedEventArgs e) 
     { 

     } 

     private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
     { 

     } 

     private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

     } 

     private void UserControl_Loaded(object sender, RoutedEventArgs e) 
     { 

     } 

     private void listBox2_SelectionChanged(object sender, SelectionChangedEventArgs e) 
     { 

     } 

     private void TreeViewItem_Selected_1(object sender, RoutedEventArgs e) 
     { 

     } 

     private void TreeViewItem_Selected(object sender, RoutedEventArgs e) 
     { 

     } 
    } 

    public class Huffman<T> where T : struct, IComparable<T>, IEquatable<T> 
    {   
     long length; 
     int size; 
     byte[] data; 
     public class Node 
     { 
      public Node next, left, right; 
      public T symbol; // This symbol is of generic type. 
      public int freq; 
      public int is_processed; 

     } 
     public Node front, rear; 
     public Huffman(MainPage form, byte[] fileContent,Func < byte[], int, T > converter) 
     { 
      MessageBox.Show("check2"); 
      // form.simpleEvent +=() => ShowClick(form,fileContent); 
      length = 0; 
      front = null; 
      rear = null; 
      MessageBox.Show("check4"); 
      length = fileContent.Length; 
      size = Marshal.SizeOf(typeof(T)); 
      Stream stream = new MemoryStream(fileContent); 
      { 
       for (long position = 0; position + size < length; position += size) 
       { 
        data = fileContent; 
        T processingValue = converter(data, 0); 
        { 
         Node pt, temp; 
         bool is_there = false; 
         pt = front; 
         while (pt != null) 
         { 
          form.listBox1.Visibility = Visibility.Visible; 
          if (pt.symbol.Equals(processingValue)) 
          { 
           pt.freq++; 
           is_there = true; 

           break; 
          } 
          temp = pt; 
          pt = pt.next; 
         } 
         if (is_there == false) 
         { 
          temp = new Node(); 
          temp.symbol = processingValue; 
          temp.freq = 1; 
          temp.left = null; 
          temp.right = null; 
          temp.next = null; 
          temp.is_processed = 0; 
          if (front == null) 
          { 
           front = temp; 
          } 
          else 
          { 
           temp.next = front; 
           front = temp; 
          } 
         } 
        } 
       } 
       stream.Close(); 
      } 

      MessageBox.Show("Yes correctly done"); 
      merge_sort(front); 
      Print_tree(front, form); 
     } 
     public Node merge_sort(Node head) 
     { 
      if (head == null || head.next == null) 
      { 
       return head; 
      } 
      Node middle = getMiddle(head); 
      Node sHalf = middle.next; 
      middle.next = null; 
      return merge(merge_sort(head), merge_sort(sHalf)); 
     } 
     public Node merge(Node a, Node b) 
     { 
      Node dummyHead, curr; 
      dummyHead = new Node(); 
      curr = dummyHead; 
      while (a != null && b != null) 
      { 
       if (a.freq <= b.freq) 
       { 
        curr.next = a; 
        a = a.next; 
       } 
       else 
       { 
        curr.next = b; 
        b = b.next; 
       } 
       curr = curr.next; 
      } 
      curr.next = (a == null) ? b : a; 
      return dummyHead.next; 
     } 
     public Node getMiddle(Node head) 
     { 
      if (head == null) 
      { 
       return head; 
      } 
      Node slow, fast; 
      slow = fast = head; 
      while (fast.next != null && fast.next.next != null) 
      { 
       slow = slow.next; 
       fast = fast.next.next; 
      } 
      return slow; 
     } 
     /////// 
     public void Print_tree(Node treee,MainPage obj) 
     { 
      Node pt = treee; 
      while (pt != null) 
      { 
       obj.listBox1.Items.Add("Symbol :" + pt.symbol + " -" + " Frequency : " + pt.freq); 
       // Debug.WriteLine("Symbol :" + pt.symbol + " -" + " Frequency : " + pt.freq); 
       pt = pt.next; 
      } 
     } 

    } 
} 

Вот XML-код:

<UserControl x:Class="FinalSS.MainPage" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
       xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" 
    d:DesignHeight="300" d:DesignWidth="400" Loaded="UserControl_Loaded"> 

<Grid x:Name="LayoutRoot" Background="Wheat" Visibility="Visible" Height="348" Width="681"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="37*" /> 
      <ColumnDefinition Width="86*" /> 
      <ColumnDefinition Width="558*" /> 
     </Grid.ColumnDefinitions> 
     <sdk:TreeView SelectedItemChanged="TreeView_SelectedItemChanged" Margin="12,12,12,41" Background="wheat" Grid.ColumnSpan="3"> 
      <sdk:TreeViewItem Header="File" Selected="TreeViewItem_Selected" > 
       <sdk:TreeViewItem.Items> 
        <sdk:TreeViewItem Selected="TreeViewItem_Selected_1"> 
         <sdk:TreeViewItem.Header> 
          <StackPanel Orientation="Horizontal" > 
           <Button Content="Browse File" Width="76" Height="20" Click="BrowseButtonClick"></Button> 
          </StackPanel> 
         </sdk:TreeViewItem.Header> 
        </sdk:TreeViewItem> 
        <sdk:TreeViewItem Selected="TreeViewItem_Selected_1"> 
         <sdk:TreeViewItem.Header> 
          <StackPanel Orientation="Horizontal"> 
           <Button Content="Show Data" Width="75" Height="20" Click="ShowButtonClick"></Button> 
          </StackPanel> 
         </sdk:TreeViewItem.Header> 
        </sdk:TreeViewItem> 
        <sdk:TreeViewItem Selected="TreeViewItem_Selected_1"> 
         <sdk:TreeViewItem.Header> 
          <StackPanel Orientation="Horizontal"> 
           <Button Content="Compress" Width="75" Height="20" Click="CompressButtonClick"></Button> 
          </StackPanel> 
         </sdk:TreeViewItem.Header> 
        </sdk:TreeViewItem> 
        <sdk:TreeViewItem Selected="TreeViewItem_Selected_1"> 
         <sdk:TreeViewItem.Header> 
          <StackPanel Orientation="Horizontal"> 
           <Button Content="close" Width="75" Height="20" Click="CloseButtonClick" ></Button> 
          </StackPanel> 
         </sdk:TreeViewItem.Header> 
        </sdk:TreeViewItem> 
       </sdk:TreeViewItem.Items> 
      </sdk:TreeViewItem> 
     </sdk:TreeView> 
     <ProgressBar Name="progressBar" Height="9" HorizontalAlignment="Left" Margin="216,82,0,0" VerticalAlignment="Top" Width="139" Foreground="#FF3AB802" Grid.Column="2" Visibility="Collapsed" /> 
     <TextBox Name="textBox" Height="23" HorizontalAlignment="Left" Margin="146,68,0,0" VerticalAlignment="Top" Width="66" Grid.Column="2" TextChanged="textBox_TextChanged" Visibility="Collapsed" /> 
     <ListBox Height="148" HorizontalAlignment="Left" Margin="0,152,0,0" Name="listBox1" VerticalAlignment="Top" Width="197" ItemsSource="{Binding}" Visibility="Collapsed" Grid.Column="2" SelectionChanged="listBox1_SelectionChanged"></ListBox> 
     <ListBox Height="148" HorizontalAlignment="Right" Margin="0,154,160,0" Name="listBox2" VerticalAlignment="Top" Width="203" SelectionChanged="listBox2_SelectionChanged" Visibility="Collapsed" Grid.Column="2"> 
      <ListBoxItem /> 
      <ListBoxItem /> 
     </ListBox> 
     <ComboBox Height="19" HorizontalAlignment="Left" Margin="13,204,0,0" Name="comboBox1" VerticalAlignment="Top" Width="104" SelectionChanged="comboBox1_SelectionChanged" Grid.ColumnSpan="2"> 
      <ComboBoxItem /> 
      <ComboBoxItem /> 
     </ComboBox> 
    </Grid> 
</UserControl> 

насколько мое поручительство касается этой проблемы связано с BitConverter в HUFFMAN конструктор вызова функции Func преобразователь создает проблему.Я думаю, мне нужно использовать Func-конвертер каким-то другим способом

+0

@ Zong Спасибо за редактирование, Еще один вопрос, пожалуйста, расскажите, как вы добавили в него скриншоты? Какова процедура? (Прежде чем ответить на вопрос, чтобы я мог написать вопрос с хорошим качеством) – Sss

+2

http://i.imgur.com/RlewdDt.png – Zong

+0

@ZongZhengLi спасибо, хорошо, я буду заботиться в будущем об этом. Но можете ли вы найти проблему в коде, не могли бы вы сообщить мне решение, если да? большое спасибо. – Sss

ответ

2

В данный момент я не вижу ошибки вашего кода. В Silverlight вы не можете отлаживать приложение Console или WinForm с помощью точек останова. Можете ли вы отправить свое решение. Тогда я могу проверить это.

+1

спасибо Бхай, я добавил оба кода, пожалуйста, просмотрите отредактированную часть. – Sss

+1

Отправьте свое решение по адресу [email protected] то я могу проверить, что здесь не так. –

+0

Хорошо Большое спасибо Bro .. вы получите его через 5 минут в своей почте. – Sss