Event Based Async Pattern - Correctly Implemented?
Oct 9, 2009
I've implemented the Event Based Async Pattern for the first time in a relatively complex class. I'm having some doubts about if I've done it as it should be done, and if there are no better approaches. One of the things that make me frown the most is how I'm currently handling all the cross thread events. This class contains a decent amount of events, about 20. What I've done is created a dictionary in which I have a list of callbacks, one for each event. The keys are a value of an enum containing all keys I created. In the underneath line, eventDelegates is the dictionary, and delegates is the enum.
a debate has been sparked here about the use of the strategy pattern in my classes. Basically, I have a 'Shape' object that is an interface 'IShape'. We have 'Circle', 'Rectangle' and 'Elongated' that are the concrete classes that must implement the IShape interface.
I saw the question posed here: Have I implemented Equals()/GetHashCode() correctly? but my c# is not as strong, and I am unfimiliar with IEquatable enough that I would like to see this in VB.NET if possible please.My example code (The class will eventually use INotifyPropertyChanged when I get there):[code]
I'm seeing a strange build bug a lot. Sometimes after typing some code we receive the following build error.
Class 'clsX' must implement 'Event PropertyChanged(sender As Object, e As PropertyChangedEventArgs)' for interface System.ComponentModel.INotifyPropertyChanged'.
And
'PropertyChanged' cannot implement 'PropertyChanged' because there is no matching event on interface 'System.ComponentModel.INotifyPropertyChanged'.
Those error should never go together! Usually we can just ignore the exception and build the solution but often enough this bug stops our build. (this happens a lot using Edit and Continue which is annoying)Removing the PropertyChanged event and retyping the same code! sometimes fixes this.We're using a code generator that causes this error to surface but just editing some files manually triggers this exception too. This error occur's on multiple machines using various setups.
As the subject describes, once I implemented support for DragDrop - The DoubleClick event of the ListView control no longer fires.An overview of the code is as follows:
Private Sub ListView_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView.MouseMove
One thing I don't understand with sending Async emails from ASP.NET page is when we call SendAsync it should be executed on a separate thread so our page can continue its execution flow and finish its response no matter how long the sending will take.How then we can call method on the same page using SendCompletedEventHandler? The page object might not exist by that time and in this forum there are examples that people doing that.My expectation was that I can have separate class which might have static method which I will execute on SendCompletedEventHandler and this way we can report possible errors.However when I'm raising exception in there the exception comes as part of Page Response. So for me it looks as SendAsync works on the same thread, page waites for it to be executed and comes back with information on any errors raised by it.
Before I build my own and after looking for quite a while (to no avai) does any one know of a function that will return the dates of a recurrence.
For instance:
- The recurrence might be the first Monday of each month.
- The second week of each month.
So what I want is to pass the recurrence information to the function and it will return in an array all the dates that are applicable.I've looked at some other topics here but none are as comprehensive as what I need.
Assume you have controls A, B, C, D and E all with a Visibility property. You also have states 1,2,3,4,5 and 6 in which various combinations of your controls would be displayed. Currently this is being handled by switch statements for each state: i.e.
Select Case PageState case "1" a.visible = false b.visible = true
[code]....
As you can imagine, this becomes a pain as every state needs a show/hide statement for each control. How can I refactor this so that adding controls and/or states becomes trivial?My first instinct is to extend the control and add a collection of states that it should display for but this sounds like overkill.
Edit:I was deliberately vague in my question in case this has other implications. In my current instance the "controls" in question are ASP Panels. Does that change anything?
I'm trying to write a 'developer friendly' wrapper for the Windows API EnumWindows - the problem is that the API uses a callback function that gets invoked on another thread, where as I want my wrapper function to simplify this and make it more useful by working like any other normal synchronous function and just returning a value.
Now if the API just called the callback once that would be fine, as I would just call the API and make the wrapper function wait until it got a signal from the callback function telling it to continue... but the API calls the callback function over 100 times (once for every window handle that exists). The biggest problem is that there is nothing that indicates that any particular call to this callback function is the last one, so my wrapper function has no idea when it is safe to continue and return the list of window handles to the caller.
The only solution I could think of is to do this:
1. The wrapper function calls the API and starts a timer that waits 2 seconds before it raises the Elapsed event. The wrapper function then pauses until it receives a signal (ManualResetEvent)
2. Each time the callback function is raised by the API on a different thread, it stops the timer (so this is before the 2 seconds have elapsed), adds the current window handle that was passed in by the API to the list of handles, then starts the timer again.
3. If the timer reaches its 2 second interval then it is assumed that we are at the end of the windows because otherwise the callback would have stopped the timer. So the timer's Elapsed event handler is what signals the original thread (that the wrapper function is executing on) to continue as we now have a complete list of windows to return.
This works fine and does exactly what I want... but I dont like it.
I dont like forcing the caller to wait an extra 2 seconds after the API has done its last callback but more importantly I dont like assuming that the API will never take longer than 2 seconds between callbacks. In reality on my PC it is never anywhere near that long between callbacks, it is something like 200 miliseconds, but I have no idea how long it would be on a slower PC and I want this to be completely reliable.
I cant seem to get VB to focus on a textbox correctly at the moment I did TextBox.focus() in the load event but still a button keeps grabbing focus anyway.
What i have in a text box that is the discount. The text box talks to the label as you type and updates it accordingly The problem is that once the discount_rate.text get to 10 or above the discount is off by 5 cents and increases as the number goes up..
Private Sub discount_rate_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles discount_rate.TextChanged Select Case radio Case "one" If discount_rate.Text = "" Then
I'm looking for some advice for an application I currently developing. I'll try to keep this as brief as possible so if additional info is need just let me know.I'm developing an Winforms based event tracking system using VB.Net (VS 2008 Pro). The application collects data via serial bar code scanners and stores this data within a MS SQL Express db located on the same Windows XP Pro workstation that the application is installed on. When the application receives the formatted string of data it checks the db table and sends a reply back to the device indicating whether the data is a duplicate. I have written a PortManager class to handle the serial based devices and this functionality is working well.
I have now been asked to incorporate a new type of collection device into the system. The new device is running embedded Linux and uses TCPIP (POE) rather than serial communication. The device manufacture has assured me he can provide a string from the devices integrated scanner in the same format as my serial based devices.
If possible, I would like to utilize the current application and just add the ability to use the TCPIP devices to it. I was thinking it might be possible to just add a new class (similar to my Port Manager class) to handle the TCPIP based devices.I'm really at a loss as to the best way to approach this. I'm just not that familiar with collecting data from a Winforms application using a TCPIP based device.
I am creating a program in which there is a listview control with many items contained in it. It also has checkboxes for each of them. I am trying to get it so that when you check the checkbox next to an item, it removes the item from the list. I am using this code:
Private Sub ListView1_ItemCheck(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckEventArgs) Handles ListView1.ItemCheck ListView1.Items.RemoveAt(e.Index) End Sub
When I run this however, and check an item, it gives me this error (I am checking the first item in the listview, which would mean the index is 0): InvalidArgument=Value of '0' is not valid for 'index'. Parameter name: index
I've have been testing this code out for both the listview events ItemCheck and ItemChecked. How is 0 out of the index range? Wouldn't it be the first item in the listview, in which case it should remove the item.
I want to populate the dropdownlist ddVerantwortlich1 with the people with the proper credentials based on the selected process step ddProzesss chritt1.It doesn't work if I want to change it using datasource and databindi have to manually loop through the table in the dataset returned from the query. then it works. but not otherwise.[code]
I found the line in a program that references UrlNormalizerUtil.UrlNormalizer to validate a url. It calls it from a GeneralPurposeUtilities file which is added to the project properties in references as a .dll file.
My question is: where does this file come from? Is is self coded or from some library? how else can the UrlNormalizer be implemented?
I have an Entity class which Implements IWeightable:
Public Interface IWeightable Property WeightState As WeightState End Interface
I have a WeightCalculator class:
Public Class WeightsCalculator Public Sub New(...) .. End Sub
Why can I not do wc.Calculate(entities)? I receive:
Unable to cast object of type 'System.Collections.Generic.List1[mynameSpace.Entity]' to type 'System.Collections.Generic.IList1[myNamespace.IWeightable]'.
If Entity implements IWeightable why is this not possible?
I've boxed in red. The class displayed here does implement INotifyPropertyChanged, but the VB compiler seems to think that the PropertyChanged event as declared does not match the signature of INotifyPropertyChanged.PropertyChanged.Here I've selected the offending line of code. Between this and the next screenshot I literally just cut and paste the exact same line back into the file (i.e., I hit Ctrl + X followed by Ctrl + V).I have this happen sometimes, particularly with the INotifyPropertyChanged interface in my experience but I have no idea if the problem is limited to that single interface (which would seem bizarre) or not.Let's say I have some code set up like this. There's an interface with a single event. A class implements that interface. It includes the event. [code] Every now and then, when I build my project, the compiler will suddenly start acting like the above code is broken. It will report that the Person class does not implement INotifyPropertyChanged because it doesn't have a PropertyChanged event; or it will say the PropertyChanged event can't implement INotifyPropertyChanged.PropertyChanged because their signatures don't match.This is weird enough as it is, but here's the weirdest part: if I just cut out the line starting with Event PropertyChanged and then paste it back in, the error goes away. The project builds.
I am programming an ordering site in VB.Net and ASP.Net.I start with the main ordering form and the idea is that the user will select a subject from the drop down list and then click a button to retrieve all modules associated with that subject in a second form (smaller than the main order form).I have created the second form (frm2) and added content to it.In the main form inside the method which represents the button being clicked, I have coded the following:
Dim frm As New frm2() frm.show()
I then get an error that show has not been declared and so I create a method stub for it.I run the program and when I click on the button I get the following error:'method or operation is not implemented.'This points to the following line in the 2nd form:
Sub show() Throw New NotImplementedException End Sub
what I need to put inside this method to make my second form load when the button is clicked?
I recently finished a class that we're using to tie Access to some WCF Services. Of course this means that the .Net classes (and all of their properties) need to be visible to COM. Given that I'm using VB10 and the Contact class has about 20 properties I went ahead and used auto-implementing properties.Much to my surprise, the properties were not accessible from within VBA in Access. I tried marking the properties as ComVisible (which I didn't have to do in the past with standard properties) and it still didn't work. After changing the auto properties to standard properties everything worked.
VB.NET .NET 3.5 I have an aggregate class called Package as part of a shipping system. Package contains another class, BoxType . BoxType contains information about the box used to ship the package, such as length, width, etc. of the Box.
Package has a method called GetShippingRates. This method calls a separate helper class, ShipRater, and passes the Package itself as an argument. ShipRater examines the Package as well as the BoxType, and returns a list of possible shipping rates/methods.
What I would like to do is construct an Interface, IRateable, that would be supplied to the helper class ShipRater. So instead of:
[Code]...
However, ShipRater requires information from both the Package and its aggregate, BoxType. If I write an interface IRateable, then how can I use the BoxType properties to implement part of the Interface?
how ListView pointer is stored/removed at ReadOnly Property ListView in ListViewItem? How is it implemented? I know ListViewItems are stored in ListViewItemCollection which has constructor New(owner as ListView) but I dont know how pointer to ListView is add/remove in ReadOnly Property in ListViewItem...
I have a base class which must be overriden. This base class sits in one dll shared by all. The derived classes will each be in their own dll such that the addition of a new derived class can be done by distributing a new dll. The set of dlls, and therefore the set of derived classes, will be discovered by the main program on startup. That's all pretty straightforward. The problem is that the main program needs to be able to query a database to figure out which type of derived class it needs, then create a class of that type. Naturally, it can't know which types will be available ahead of time because even I don't know that. The program has to be dynamically extensible.The obvious way to do this is to have an interface in the dll that is implemented by a class with a default constructor. The sole purpose of that class would be to return an object of the type (one of the derived types) defined in that dll. The derived types can't really be this class, because they can't have a default constructor since the base class doesn't have a default constructor, and the derived class can't make up the arguments that the base class constructor needs.
So basically, each dll that houses a derived class would also house a simple class that implemented an interface for the sole purpose of creating that particular derived class. The main program would examine the dll to find a class that implemented the interface, and once it found one, it could ask it what type of class it created, or it could ask it to create an instance of that class. It seems like there ought to be an easier way to dynamically add new classes to the project. It seems like the derived class ought to be able to tell the main project what type it was. This could be done, except that the derived class would have to exist before any of its methods could be called unless the methods were shared. Since you can't have a shared method in an interface, the interface itself would make no sense at that point, in which case I would need to discover whether the class in the dll derived from the base class in the second dll, just to figure out whether or not I wanted to create it. That's getting convoluted by now, so I guess I'll leave it there. The basic point is that the base class is known to the main program from a common dll. The number and types of derived classes can't be known at this time, so the program has to be able to discover them dynamically. Each derived class will sit in its own dll (or there could be more than one in a dll), and has to be discovered, and instances created, as needed, by the main program.
I am working on an ASP.NET project where I use VB.NET within Visual Studio 2010. Some of the other developers on the project are using Visual Studio 2008. We all check our code into single SVN repository. I would like to start using Auto-Implemented Properties within VB.NET ...
Property FirstName as String instead of ... Private FirstName as String
[code].....
My concern is that this could mess up things for those using VS2008. What would happen if someone using VS2008 needed to modify my class that made use of Auto-Implemented Properties? I am assuming that since everything compiles down to IL code then there would be no issue in binary compatibility. Though a problem would arise when editing source.
I have somehow managed to disable auto-implemented properties in my VS2010 IDE how to turn it back on. Almost every article on the internet loves to explain auto-implemented properties but doesnt give you the crucial option of how to turn it on or off.