|
Ditto what others have said regarding arrays.
Personally I'd only use an int[] if it is being initialised once, and then will not have elements added or removed. That could be useful for certain specific applications.
For example...
public class Simple
{
private int[] _int = { 1, 2, 3, 4, 5 };
public int[] MyInt { get { return _int; } }
}
private static void TestSimple()
{
Simple s = new Simple();
s.MyInt[0] += 1;
}
...is fine. But as others have said if the size of the array is to be dynamic (items being added) I'd use say a List<int> probably.
|
|
|
|
|
Thank you all for your help. This is a great forum indeed!
I will definately use a List, as there will be numbers of unknown quantity and value in the beginning of the programme.
|
|
|
|
|
Hello
I'm some kind of new to c# and tried out a tutorial to download some comic images from an rss feed.
Now I want to optimize the program, so that the UI-Thread isn't blocked anymore. I've read that I should use Backgroundworker und HttpWebRequest instead of WebClient.
Problem: I tried out backgroundworker and httpwebrequest instead of webclient, but the UI is still freezing and I don't really understand why.
Hope somebody can explain me, what I'm doing wrong.
public class FailsViewModel :INotifyPropertyChanged
{
static int i = 0;
public FailsViewModel()
{
this.Fails = new ObservableCollection<FailViewModel>();
InitializeBackgoundWorker();
LoadFailsAsync();
}
private void InitializeBackgoundWorker()
{
_bw = new BackgroundWorker();
_bw.WorkerReportsProgress = true;
_bw.WorkerSupportsCancellation = true;
_bw.DoWork += new DoWorkEventHandler(bw_DoWork);
_bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
_bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
public void LoadFailsAsync()
{
var request = (HttpWebRequest)WebRequest.Create(new Uri("http://schabus.knor.net/rss"));
request.BeginGetResponse(r =>
{
var httpRequest = (HttpWebRequest)r.AsyncState;
var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);
using (var reader = new StreamReader(httpResponse.GetResponseStream()))
{
var response = reader.ReadToEnd();
_bw.RunWorkerAsync(response);
}
}, request);
}
private Collection<FailViewModel> LoadItems(string e)
{
Collection<FailViewModel> fvmc = new Collection<FailViewModel>();
XElement xel = XElement.Parse(e);
Collection<FailViewModel> fails = new Collection<FailViewModel>();
var items = xel.Descendants(XName.Get("item"));
foreach (var item in items)
{
var desc = item.Descendants(XName.Get("encoded", "http://purl.org/rss/1.0/modules/content/")).SingleOrDefault();
var title = item.Descendants(XName.Get("title")).SingleOrDefault();
if (desc != null && title != null)
{
string url = desc.Value.Substring(desc.Value.IndexOf("src=\"") + 5);
string localUrl = url.Substring(0, url.IndexOf("\""));
string absoluteUrl = "http://schabus.knor.net" + localUrl;
FailViewModel fvm = new FailViewModel();
fvm.Title = title.Value;
fvm.Uri = new Uri(absoluteUrl, UriKind.Absolute);
fvmc.Add(fvm);
}
}
return fvmc;
}
private Collection<FailViewModel> LoadItems_WebRequest(DownloadStringCompletedEventArgs e)
{
Collection<FailViewModel> fvmc = new Collection<FailViewModel>();
XElement xel = XElement.Parse(e.Result);
Collection<FailViewModel> fails = new Collection<FailViewModel>();
var items = xel.Descendants(XName.Get("item"));
foreach (var item in items)
{
var desc = item.Descendants(XName.Get("encoded", "http://purl.org/rss/1.0/modules/content/")).SingleOrDefault();
var title = item.Descendants(XName.Get("title")).SingleOrDefault();
if (desc != null && title != null)
{
string url = desc.Value.Substring(desc.Value.IndexOf("src=\"") + 5);
string localUrl = url.Substring(0, url.IndexOf("\""));
string absoluteUrl = "http://schabus.knor.net" + localUrl;
FailViewModel fvm = new FailViewModel();
fvm.Title = title.Value;
fvm.Uri = new Uri(absoluteUrl, UriKind.Absolute);
fvmc.Add(fvm);
}
}
return fvmc;
}
#region Properties
private BackgroundWorker _bw = null;
public volatile bool isComplete = false;
private ObservableCollection<FailViewModel> _Fails = default(ObservableCollection<FailViewModel>);
public ObservableCollection<FailViewModel> Fails
{
get
{
return _Fails;
}
set
{
_Fails = value;
OnPropertyChanged("Fails");
}
}
private FailViewModel _SelectedFail = default(FailViewModel);
public FailViewModel SelectedFail
{
get
{
return _SelectedFail;
}
set
{
_SelectedFail = value;
OnPropertyChanged("SelectedFail");
}
}
#endregion
protected virtual void OnPropertyChanged(string propertyName)
{
if(this.PropertyChanged != null)
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
#region BackgroundWorker
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = LoadItems((string)e.Argument);
}
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
((WebClient)sender).DownloadStringCompleted -= client_DownloadStringCompleted;
if (e.Error == null && e.Cancelled == false)
{
MessageBox.Show("DSC-" + (i++) +"\n"+e.Result );
_bw.RunWorkerAsync(e);
}
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Collection<FailViewModel> c = e.Result as Collection<FailViewModel>;
for(int i=0; i<c.Count;i++)
{
this.Fails.Add(c.ElementAt(i));
Thread.Sleep(1);
}
MessageBox.Show("fertig - bw_RunWorkerCompleted");
_bw.DoWork -= bw_DoWork;
_bw.ProgressChanged -= bw_ProgressChanged;
_bw.RunWorkerCompleted -= bw_RunWorkerCompleted;
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
MessageBox.Show("Progress");
}
#endregion
|
|
|
|
|
I didn't study all that in detail, however I noticed you still have a LoadFailsAsync method running on the main thread, so I guess the problem is there. I would perform all web communication in synchronous mode inside the DoWork handler, once you are using an extra thread (or BGW) there no longer is a need to go asynchronously and things should become simpler...
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Got already an implementation like that, where the the LoadFailsAsync- method calls the web communication asynchronously with HttpWebRequest and load the images inside it. (commentented out code in the LoadFailsAsync() above)
But got also the same effect.
public void LoadFailsAsync()
{
var request = (HttpWebRequest)WebRequest.Create(new Uri("http://schabus.knor.net/rss"));
request.BeginGetResponse(r =>
{
var httpRequest = (HttpWebRequest)r.AsyncState;
var httpResponse = (HttpWebResponse)httpRequest.EndGetResponse(r);
using (var reader = new StreamReader(httpResponse.GetResponseStream()))
{
var response = reader.ReadToEnd();
Collection<FailViewModel> c = LoadItems(response);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
for (int i = 0; i < c.Count; i++)
{
this.Fails.Add(c.ElementAt(i));
Thread.Sleep(1);
}
MessageBox.Show("fertig - bw_RunWorkerCompleted");
});
}
}, request);
}
|
|
|
|
|
what a mess. That isn't synchronous at all, every Begin , End , Async word points to an asynchronous implementation which is harder to get right and most often meaningless when running on a separate thread or BGW.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
thank you Luc so far, but I think synchronous HttpWebRequest / WebClient methods aren't supportet for WP7. So it was unfortunately impossible for me to use BackGroundWorker with synchronous HttpWebRequest-methods.
So I write it completely new but it's still freezing the UI.
How Luc told me I tried to avoid any use of nested asyn mehtods/threads.
My Idea was to use HttpWebRequest to download it asynyhronous (without other threads... because HttpWebRequest is already asynchronous)
hope the code is better structured then the code above
public class ComicsViewModel : INotifyPropertyChanged
{
public ComicsViewModel()
{
if (!DesignerProperties.IsInDesignTool)
{
this.ComicList = new ObservableCollection<ComicViewModel>();
this.IsReading = true;
LoadComicsRss2();
}
}
private void LoadComicsRss2()
{
Uri uri = new Uri("http://schabus.knor.net/rss", UriKind.Absolute);
HttpWebRequest req = HttpWebRequest.CreateHttp(uri);
req.BeginGetResponse(HandleGetComicsResponse, req);
}
private void HandleGetComicsResponse(IAsyncResult result)
{
HttpWebRequest state = (HttpWebRequest)result.AsyncState;
using (var response = state.EndGetResponse(result))
{
using (var streamReader = new StreamReader(response.GetResponseStream()))
{
var data = streamReader.ReadToEnd();
Deployment.Current.Dispatcher.BeginInvoke(() => { this.ComicList.Clear(); });
XElement xel = XElement.Parse(data);
var items = xel.Descendants(XName.Get("item"));
foreach (var item in items)
{
var desc = item.Descendants(XName.Get("encoded",
"http://purl.org/rss/1.0/modules/content/")).SingleOrDefault();
var title = item.Descendants(XName.Get("title")).SingleOrDefault();
if (desc != null && title != null)
{
string url = desc.Value.Substring(desc.Value.IndexOf("src=\"") + 5);
string localUrl = url.Substring(0, url.IndexOf("\""));
string absoluteUrl = "http://schabus.knor.net" + localUrl;
ComicViewModel vm = new ComicViewModel();
vm.Title = title.Value;
vm.Uri = new Uri(absoluteUrl, UriKind.Absolute);
Deployment.Current.Dispatcher.BeginInvoke(() => { this.ComicList.Add(vm);});
}
}
}
}
Deployment.Current.Dispatcher.BeginInvoke(() => { this.IsReading = false; });
}
}
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="ComicViewModelTemplate">
<StackPanel>
<TextBlock Text="{Binding Title}" HorizontalAlignment="Center"/>
<Image Source="{Binding Uri}"/>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{Binding Source={StaticResource ComicsViewModelDataSource}}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ListBox Margin="10,0" ItemTemplate="{StaticResource ComicViewModelTemplate}" ItemsSource="{Binding ComicList}" SelectedItem="{Binding SelectedComic, Mode=TwoWay}">
<Custom:Interaction.Triggers>
<Custom:EventTrigger EventName="SelectionChanged">
<ic:NavigateToPageAction TargetPage="/ComicPage.xaml"/>
</Custom:EventTrigger>
</Custom:Interaction.Triggers>
</ListBox>
</Grid>
</Grid>
|
|
|
|
|
Hi Peter,
1.
I'm not familiar with WP7, and am unaware of what .NET parts are missing over there, sorry.
2.
"it's still freezing the UI" isn't informative enough: is it just dead for a while and in the end produces all the output hoped for? does it do anything at all? or is it just dead permanently right from the start?
3.
I still see a foreach loop with a BeginInvoke inside. That could go wrong in at least two ways: either the BeginInvoke for some reason is blocking, turning the whole loop in a long operation, hence freezing the GUI for a long while. Or all those Invokes get queued or even launched somehow, possibly overloading the system.
Suggestions:
- add logging with timestamps, so you KNOW what is happening;
- reduce the loop to just one or two iterations.
In general: when in trouble, simplify, improve observability, get the facts.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
2. I meant the UI wasn't responsive for some time minute
luckily I found my answer in those two Links here:
http://tinyurl.com/28zb9x3
http://tinyurl.com/636qz5z
anyways thank you Luc!
|
|
|
|
|
A generic list i.e. mResults has several fields and records...
Fields are such as field1, field2, field3, etc...
How can I sort this list by Field2? Is it easier with LINQ?
Thanks
|
|
|
|
|
Well, the LINQ approach is fairly easy:
var sortedList = from res in mResults
order by res.Field2
select res;
|
|
|
|
|
This is what I am using but there is an error:
var sortedList = from res in mResults
order by res.Field2
select res;
return (List<ClassName>)sortedList
Error is:
Unable to cast object of type 'System.Linq.OrderedEnumerable`2[ProjectName.ClassName,System.String]' to type 'System.Collections.Generic.List`1[ProjectName.ClassName]'.
|
|
|
|
|
Try this code, I didn't test it though
return sortedList.ToList<ClassName>();
|
|
|
|
|
The error has gone but:
at present I have the mResult being returned in a method.
i.e. return mResult;
Now I am using the linq code you sent i.e.
internal static List<Classname> mResult
private void MethodName()
{
...
...
var sortedList = from res in mResult
orderby res.field2
select res;
return sortedList.ToList<ClassName>();
}
Questioin:
How can I declare the var sortedList to be something like:
internal static var sortedList
and then in the LINQ code I do not use the var to declare?
Thanks
|
|
|
|
|
You don't use the implicit var. You declare the sortedList as a List<ClassName> and then your query becomes:
sortedList = (from res in mResult
orderby res.field2
select res).ToList();
|
|
|
|
|
|
If you mean you already have an instance of List<mResults>, assigned to a variable say list...
list.Sort((i, j) => { return i.Field2.CompareTo(j.Field2); });
should work.
|
|
|
|
|
Actually, I think you mean your list is called mResults, so in that case I would do...
mResults.Sort((i, j) => { return i.Field2.CompareTo(j.Field2); });
|
|
|
|
|
This article[^] tells you how to do it without LINQ.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Nah. It's crap. Only kidding - it's a good article.
A small critique - the plural of criterion is criteria, so you have s singular of "the criterion is...", where the plural would be "Multiple sort criteria are easy to implement". A criterium is actually a bike race.
|
|
|
|
|
Thanks Pete.
In Dutch we use the Latin word criterium for both; English apparently has borrowed the Greek word κριτήριο; all fixed now.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
I am confused with the process to export datagridview data to excel or pdf format. Could somebody help me on this please?
Thank you
|
|
|
|
|
I am sure there is no need to shout. To export data to excel look up
ADO.Net or
Excel Interop . to export data to pdf try iTextSharp library. In future you don't need to use bold letters. Most people in these forums can read quite fine.
|
|
|
|
|
For Excel, just put it on the clipboard. (DataGridView.GetClipboardContent.)
For PDF there is no obvious meaning for what you want, never mind a method to do it. PDF is a display format not a data table one. If you want to create a PDF which has within it some text and lines that makes it look like a table, you can do that yourself (or find a library that does it).
|
|
|
|
|
Hi,
I have two classes say Class A and Class B. I am trying to find how
do I get reference the loaded instance of Class A in Class B.
I do not want to get a new instance of Class A. I want to be able to
reference to the loaded instance and use the loaded methods and properties.
Class A
{
...
Class A myClass = New Class A();
...
...
Class B clsb = New Class B();
clsb.DoSomething(int a, int b)
}
Class B
{
...
public void DoSomething(int a, int b)
{
....
//I want to be able to reference to the loaded instance which is 'myClass' of the Class A. (not a new instance)
}
}
Can some one please help me with this.
Thanks,
L
.
|
|
|
|