我正在使用 Silverlight 5 (VS 2010) 创建一个 C# Web 应用程序。
我最初创建了一个运行良好的控制台应用程序,现在我正在将其调整为 Web 应用程序。
即使在 Web 应用程序中,它对于特别设置的数据类型也可以正常工作(例如 forint
而不是<T>
它可以正常工作)但是当我使用泛型时它就不起作用了。它编译无错误,但它甚至不调试设置为“切换断点”的区域。最初的 GUI 是这样的:
但是当控制传递到容易出错的部分时,GUI突然像这样消失了
我保留断点的地方被这个取代了
(见最左边)因此我无法调试以找到问题。
我正在尝试做的一些解释:在下面的给定代码中,我有一个二进制文件并存储在数据类型的“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 类的对象创建中的功能有什么问题吗?
我什至无法调试 Huffman 类,我在 Huffman 类的起点和终点设置了断点,但控件没有进入,并且 Internet Explorer 上的按钮(使用 XAML GUI 创建)消失了。
这是我的完整代码:(请注意我正在读取二进制文件(任何扩展名为“.o”(FileName.o)的文件都可以用于测试我的代码,我读得很好)):
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>
就我的保证而言,这个问题是由于 Huffman 构造函数中的BitConverter调用函数 Func 转换器造成的问题。我想我需要以其他方式使用 Func 转换器非常感谢您的帮助。