jump to navigation

Software Architect Conference 2012 November 19, 2012

Posted by codinglifestyle in Architecture, ASP.NET, CodeProject, Parallelism.
Tags: , , , ,
add a comment

I was fortunate enough to have the opportunity to attend the Software Architect Conference this year in London.  This is the same group which puts on DevWeek.  It was short and sweet, just 2 days without the additional sessions before and after.  Often with the daily grind you simply don’t have the time or inclination to challenge yourself with the sort of material presented at these conferences.  This is what makes them unique, for a few precious days you are free of distractions to consider how and why we do what we do.  I certainly found it useful and some of the speakers where truly impressive.  While the technology we use continues to change at the speed of light, the great thing about software architecture is many of the basic principals of building a stable, well-engineered system haven’t changed since medieval times.

Keynote

  • Theme: 21st century architects should aspire to be like medieval “master builders”
    • 7 years apprentice, many years to master, administers the project, deals with client, but still a master mason
    • Keep coding – credibility with team, mitigates ivory tower
  • 20th century software architects
    • Stepped away from the code
    • UML
    • Analysis paralysis
    • Ivory Tower syndrome
  • Architecture traps
    • Enterprise Architecture Group – not sustainable, disconnected
    • CV driven development – ego and fun over needs and requirements
    • Going “Post-technical” – no longer involved in programming
  • Software Architecture summed up
    • Create a shared vision – get everyone to move in the same direction
  • Architectural lessons learnt lost in Agile – baby out with the bath water
    • It is a myth that there is a conflict between good software architecture and agile
  • What we do
    • Requirements and constraints
    • Evaluate and vet technology
    • Design software
    • Architectural evaluation
    • Code!
    • Maintainability
    • Technical ownership
    • Mentoring
  • True team leadership is collaborative / mentoring
  • Big picture: Just enough architecture to provide vision enough to move forward

Architectural Styles

  • Architectural definition defines 3 things
    • What are the structural elements of the system?
    • How are they related to each other?
    • What are the underlying principles and rationale to the previous 2 questions?
  • Procedural
    • Decompose a program into smaller pieces to help achieve modifiability.
    • Single threaded sequential execution
  • RPC Model
    • Still procedural: single thread of control
  • Threads
    • Decouples activities from main process but still procedural
    • Shared data must be immutable or copied
    • Some people, when confronted with a problem, think, “I know, I’ll use threads,” and then two they hav erpoblesms.
  • Event based, Implicit Invocation
    • The components are modules whose interfaces provide both a collection of procedures and a set of events
    • Extensible / free plumbing
    • Inversion of control (not dependency inversion)
  • Messaging
    • Asynchronous way to interact reliably
    • Instead of threads and shared memory use process independent code and message passing
  • Layers
    • Regardless of interactions and coupling between different parts of a system, there is a need to develop and evolve them independently
    • Each layer having a separate and distinct responsibility following a reasoned and clear separation of concerns
    • Often “partitioned” but not true layers due to cross references which sneak in
  • Alternate Layers – spherical
    • Core – domain model
    • Inner crust – services wrapped around core
    • Outer crust – wrapped external dependencies
  • Micro-kernel / Plug-in
    • Small hub with everything plugged in
    • Separates a minimal functional core from extended functionality and customer-specific parts
  • Shared repository
    • DB and the like
    • Procedures secondary, data is king!
    • Maintain all data in a central repository shared be all functional components of the data-driven application and let the availability, quality, and state of that data trigger and coordinate the control flow of the application logic.
  • Pipes & Filters
    • Divide the application’s task into several self-contained data processing steps and connect these steps to a data processing pipeline via intermediate data buffers.
    • Process & queue → process & queue → process & queue

The Architecture of an Asynchronous Application

  • Heavy focus on messaging throughout talk
  • About Messaging
    • Guaranteed delivery at a cost
    • Reliable and scalable
    • Subscription models
      • 1 : n
      • Round robin
      • Publish / Subscribe
  • Messaging Terms
    • Idempotency – will doing something twice change data / state?
    • Poison message – situation where a message keeps being redelivered (perhaps because an exception is thrown before an ack is returned to queue)
  • Messaging platforms
    • MSMQ – MS specific (personally found it easy enough to use)
    • IBM MQ
    • NServiceBus
    • RabbitMQ – multiplatform, Multilanguage binding. Mentioned in numerous talks and focus of talk.
    • SignalR – interesting client-side messaging platform could be a more powerful model than using web services on the client
      • install-package SignalR with NuGet
      • Picks best available connection method
      • Push from server to client
      • Broadcast to all or to a specific client

Async with C# 5

  • This talk is largely about Tasks and iterates through several examples of an application trying various asynchronous styles. The point is to try to get a minimal syntax such that an asynchronous application can be written is the same number of lines as a procedural program.
  • Context – must know the identity of which thread is executing. Critical in UIs and error handling
    • SynchronizationContext class can revert thread context to calling thread (as can several other methods such as Invoke)
  • Tasks – a piece of asynchronous functionality
    • Uses continuations to handle results
  • Async keyword – marks a function to allow use of the await keyword. Must return void or a Task.

    private async void CalculatePi()
    {
      // Create the task which runs asynchronously.
      Task<double> result = CalculatePiAsync();

      // Calls the method asynchronously.
      await result;
     
      // Display the result.
      textBox1.Text += result;

    }

  • Putting a try/catch around this an the compiler will ensure that the error is rethrown in the correct context.
  • Automatic use of thread pool which measures throughput to scale number of running threads up or down, as appropriate
  • Progress / Cancellation Features
    • IProgress<T>
  • Can launch a collection of classes and then use different operation types such as
    • var task = Task.WhenAny(tasks);
    • which returns when the first task completes. Or use Task.WhenAll to wait for all tasks.
  • WCF can generate the async methods to use tasks when adding Service References -> Advanced.

Inside Requirements

  • Kevlin Henny, author 97 Things Every Programmer Should Know and Pattern Oriented SW Arch
  • While listening to requirements we often stop listening while jumping ahead to solutions
  • Killer question when cutting through nefarious design agendas: “What problem does this solve?”
  • Patterns often misapplied – using a hammer to drive a screw leading to a pattern zoo
  • Composing a solution to a problem rather than analysis to understand the problem
  • Many to many relationships don’t need to be normalized (they model the real world)
  • Describing is not the same a prescribing
  • A model is an abstraction of a point of view for a purpose
    • Good – omits irrelevant detail
    • Bad – omits necessary detail
  • RM-ODP: reference model using viewpoints a way of looking at a system / environment

    • Enterprise – What does it do for the business?
    • Information – What does it need to know?
    • Computational – Decomposition into parts and responsibilities
    • Engineering – Relationship of parts
    • Technology – How will we build it?
  • Use Case
    • Use inverted pyramid style to place most important detail at the top. Move post-condition next to pre-condition. Sequence, containing detail about how you accomplish the steps in-between pre and post at bottom as only interest to implementers.
      • Intent
      • Pre-condition
      • Post-condition
      • Sequence – lots of juicy detail but actually least important from an architecture point of view
  • User Story
    • Traditional Connextra form
      • As a <role>,
      • I want <goal/desire>
      • So that <benefit>
        • As an Account Holder
        • I want to withdraw cash from an ATM
        • So that I can get money when the bank is closed
    • Dan North scenario form
      • Given <a context>
      • When <a particular event occurs>
      • Then <an outcome is expected>
        • Scenario 1: Account has sufficient funds
        • Given the account balance is \$100
        • And the card is valid
        • And the machine contains enough money
        • When the Account Holder requests \$20
        • Then the ATM should dispense \$20
        • And the account balance should be \$80
        • And the card should be returned
  • Problems with the Use Case / User Story approach
    • Observations are always made through a filter or world-view
    • Until told what to observe you don’t know what you’ll get. In that case, is it even relevant?
    • Use Case Diagrams neglect to notice they are fundamentally text/stories
  • Context Diagrams – shows the world and relationships around the system (UML actors)
    • Litmus test: what industry does the diagram apply to?
    • Not a technical decomposition
    • You’re an engineer planning to build a bridge across a river. So you visit the site. Standing on one bank of the river, you look at the surrounding land, and at the river traffic. You feel how exposed the place is, and how hard the wind is blowing and how fast the river is running. You look at the bank and wonder what faults a geological survey will show up in the rocky terrain. You picture to yourself the bridge that you are going to build. (Software Requirements & Specifications: “The Problem Context”)

    • An analyst trying to understand a software development problem must go through the same process as the bridge engineer. He starts by examining the various problem domains in the application domain. These domains form the context into which the planned Machine must fit. Then he imagines how the Machine will fit into this context. And then he constructs a context diagram showing his vision of the problem context with the Machine installed in it.
  • Problem Frame approach – describe a problem in diagrams
  • Grady Booch
    • Use centric – visualization and manipulation of objects in a domain
    • Datacentric – integrity persisting objects
    • Computational centric – focus on transforming objects
  • In summary: move from ignorance / assumptions → knowledge gathered from multiple points of view

A Team, A System, Some Legacy… and you

  • Legacy System – so valuable it can’t be turned off (and it’s paid for!)
  • Be aware a legacy system often comes with a legacy team engrained in their own methods
  • Being late to the party
    • Software architecture often seems valuable only once things have gone wrong.
    • Architects often join existing projects with to help improve difficult situations
    • Often a real sense of urgency to “improve”
    • Avoid distancing self to ivory tower and likewise avoid digging in thus losing big picture focus
  • Software architecture techniques offer a huge value for older or troubled projects. Especially techniques to understand where you are and with whom
  • Stage 1: Understand
    • Right perspective
      • See gathering requirements for perspectives of end user, business management, IT Managers, development, and support
    • Automated analysis tools
      • NDepend, Lattix, Stucture 101, Sonar
      • Dependency analysis
      • Metrics
    • Monitor / Measure
      • Leverage existing production metrics
        • IIS
        • Oracle Enterprise Manager
      • Implementation metrics
      • Stakeholder opinions
    • Architectural Assessment
      • Systems Quality Assessment
        • Context and stakeholder requirements
        • Functional and deployment views
        • Monitor and measure
        • Automated analysis
        • Assessment Patterns
          • ATAM – architectural trade off analysis method
          • LAAAM – Lightweight architectural assessment method- more practical
          • TARA – tiny architectural review approach (recommended)
    • Minimal Modelling
      • Define notation / terminology
      • Break up system to different viewpoints
        • Functional
        • Data
        • Code
        • Runtime
        • Deployment – systems / services
        • Ops – run, controlled, roll-back
      • Focus on essentials for target audience
    • Deliverable:
      • System context and requirements
      • Functionality and deployment views
      • Improve Analysis
      • Requirements Assessment
      • Identity and report
      • Conclusion for sponsor
      • Deliver findings and recommendations
  • Stage 2: Improve
    • Team must be involved or rocketing risk affecting morale, confidence, competence
    • Choices based on risk
      • Assess -> Prioritize -> Analyse -> Mitigate
    • Engage in Production
      • Why
        • Reality check
      • How
        • Monitoring, stats, and incidence management
      • Who
        • Biz man, IT man, support
    • Tame the Support Burden
      • Drain on development
      • Support team can offset this
      • Avoid “over the wall” mentality
    • Continuous Integration and Deployment
      • Start simple
      • Increased efficiency and reliability
    • Automated Testing
      • Unit test + coverage, regression tests
      • Costly
    • Safe step evolution
      • Control risk
      • Wrap with tests
      • Partition
      • Simplify
      • Improve
      • Generalize
      • Repeat
    • Stay coding – but if a pure architect stay off the critical path
      • Beware ROI of your coding skills vs. architect’s skills
      • Refactor, write unit tests, address warnings
  • Define the future
    • Good for the team
    • Clear, credible system architecture for the medium term (1-2 years)
    • Beware: timing and predictions

Technical Debt

  • As an evolving program is continually changed, its complexity (reflecting deteriorating structure) increases unless work is done to maintain or reduce it
  • Technical Debt is a metaphor developed by Ward Cunningham to help us think about the above statement and choices we make about the work required to maintain a system
  • Like a financial debt, the technical debt incurs interest payments, which comes in the form of the extra effort that we have to do in future development because of the quick and dirty design choice. We can choose to continue paying the interest, or we can pay down the principal by refactoring the quick and dirty design into a better design
  • Sometimes, upon reflection, it is better to pay interest. But are we trapped paying so much interest we can never get ahead?
  • What is the language of debt?
    • Amortise, repayment, balance, write off, restructure, asset, interest, default, credit rating, liability, principal, load, runaway, loan, consolidation, spiralling, value
  • Shipping first time code is like going into debt. A little debt can speed delivery so long as it is paid back promptly with a rewrite
  • The danger is ignoring or not paying back the debt (compound interest!)
  • Rebuttal: A mess is not a technical debt. A mess is just a mess.
  • Counter response: The useful distinction isn’t between debt or non-debt, but between prudent and reckless debt.
  • There is also a difference between deliberate debt and inadvertent debt.

  • There is little excuse for introducing reckless debt
  • Awareness of technical debt is the responsibility of all roles
  • Consideration of debt must involve practice and process
  • Management of technical debt must account for business value

  • Perfection isn’t possible, but understanding the ideal is useful

Books, People, and Topics of Note                                       

  • Simon Brown – www.codingarchitecture.com
  • Alan Holub – www.holub.com
  • Kevlin Henney – Pattern Oriented Software Architecture
  • Grady Booch – architecture vs. design
  • Linda Rising
  • George Fairbanks – Just Enough Software Architecture
  • Roy Osherove – Notes to a Software Team Leader
  • Top 10 Traits of a Rockstar Software Developer
  • Becoming a Technical Leader – Gerald Weinberg
  • 101 Things I Learned in Architecture School
  • Architecting Enterprise Solutions
  • Software Architecture – Perspectives of an Emerging Discipline
  • Software Requirements and Specification – Michael Jackson
  • Problem Frames – Michael Jackson
  • 12 Essential Skills For SW Arch
  • Refactoring to Patterns
  • Managing Software Debt
  • Modernizing Legacy Systems
  • Working Effectively with Legacy Code
  • Growing Object-Oriented Software, Guided by Tests
  • Knockout.js – MVVM javascript library. Takes JSON and allows you to connect to HTML in a simple way I presume w/o the manual jQuery work of redrawing your control (e.g. autocomplete textbox)
  • Backbone.js – model / view extension with events
  • Parasoft Jtest smoke test
  • Selenium automation UI test
  • RabbitMQ – client side messaging queue
  • LightStreamer / SignalIR – web sockets for client (stop gap for HTML5?)
Advertisements

Understanding BackgroundWorker and Encapsulating your own Thread Class February 22, 2011

Posted by codinglifestyle in C#, CodeProject, Parallelism.
Tags: , , , , , , ,
add a comment

You may have come across this page if you were searching for any of the following:

  • BackgroundWorker events not firing
  • BackgroundWorker RunWorkerCompleted event not firing
  • BackgroundWorker threads frozen
  • Encapsulate thread class

Yesterday my web page was launching several worker threads and waiting for them to return to amalgamate the results in to a single data set to bind to a grid. Launching several worker threads and waiting for a join is a common pattern. To nicely encapsulate the thread itself I derived a class from BackgroundWorker. BackgroundWorker has many advantages such as using an event model, thread pool, and all the thread plumbing built right in. All you have to do is override OnDoWork and off you go. The RunWorkerCompleted event was used, in conjunction with a lock, to collect the data once the worker thread finished.

Everything looked good but for some reason the event never fired. The problem was that I had gotten myself in to a deadlock scenario. The expectation is that when the event fires the delegate method will run in the context of the thread which fired it. If this were true, this would have allowed my synchronization logic to operate normally and not deadlock. The reality is that BackgroundWorker goes out of its way to run this event in the calling thread’s identity. It did this so when using BackgroundWorker in conjunction with the UI no invoke will be required (an exception will be thrown if a thread tries to touch the UI’s controls requiring you to check InvokeRequired).

When in doubt, use something like this to check the identity of the thread executing the code:

Trace.WriteLine(string.Format(“Thread id {0}”, System.Threading.Thread.CurrentThread.ManagedThreadId));

Once putting the above trace in the code I would clearly see that the identity of my main thread was identical to the thread identity in the RunWorkerCompleted event. Once the code tried to aquire the lock it was all over.

So the solution in my case was not to use the RunWorkerCompleted event. I added an alternative event to my thread class and called that at the end of OnDoWork. The event executed in the context of the thread, as expected, and my synchronization logic worked fine. But I couldn’t help feeling it was a bit of a kludge and pondered whether I should be deriving from BackgroundWorker at all. However, what’s the alternative? There really aren’t other alternatives to BackgroundWorker built in to the framework but it is easy to create your own.  See below:

 /// <summary>
 /// Abstract base class which performs some work and stores it in a data property
 /// </summary>
 /// <typeparam name="T">The type of data this thread will procure</typeparam>
 public abstract class ThreadBase<T>
 {
 #region Public methods
 /// <summary>
 /// Does the work asynchronously and fires the OnComplete event
 /// </summary>
 public void DoWorkAsync()
 {
     DoWorkAsync(null);
 }

 /// <summary>
 /// Does the work asynchronously and fires the OnComplete event
 /// </summary>
 /// <param name="arguement">The arguement object</param>
 public void DoWorkAsync(object arguement)
 {
 ThreadPool.QueueUserWorkItem(DoWorkHelper, arguement);
 }

 /// <summary>
 /// Does the work and populates the Data property
 /// </summary>
 public void DoWork()
 {
 DoWork(null);
 }

 /// <summary>
 /// Does the work and populates the Data property
 /// </summary>
 /// <param name="arguement">The arguement object</param>
 /// <remarks>
 /// Can be called to run syncronously, which doesn't fire the OnComplete event
 /// </remarks>
 public abstract void DoWork(object arguement);
 #endregion

#region Private methods
 private void DoWorkHelper(object arguement)
 {
 DoWork(arguement);
 if (OnComplete != null)
     OnComplete.Invoke(this, Data);
 }
 #endregion

#region Properties
 public T Data { get; protected set; }
 #endregion

#region Events

 /// <summary>
 /// Delegate which is invoked when the thread has completed
 /// </summary>
 /// <param name="thread">The thread.</param>
 /// <param name="data">The data.</param>
 public delegate void ThreadComplete(ThreadBase<T> thread, T data);

 /// <summary>
 /// Occurs when the thread completes.
 /// </summary>
 /// <remarks>This event operates in the context of the thread</remarks>
 public event ThreadComplete OnComplete;
 #endregion
 }

My generic ThreadBase class is a lightweight baseclass substitute for BackgroundWorker providing the flexibility to call it synchronously or asynchronously, a generically typed Data property, and an OnComplete event. The OnComplete will execute in the thread’s context so synchronization of several threads won’t be a problem. Take a look at it in action:

 public class MyThread : ThreadBase<DateTime>
 {
 public override void DoWork(object arguement)
 {
 Trace.WriteLine(string.Format("MyThread thread id {0}", System.Threading.Thread.CurrentThread.ManagedThreadId));

Data = DateTime.Now;
 }
 }

What a nicely encapsulated thread! Below we can see how cleanly a MyThread can be used:

 MyThread thread = new MyThread();
 thread.OnComplete += new ThreadBase<DateTime>.ThreadComplete(thread_OnComplete);
 thread.DoWorkAsync();

 void thread_OnComplete(ThreadBase<DateTime> thread, DateTime data)
 {
 Trace.WriteLine(string.Format("Complete thread id {0}: {1}", Thread.CurrentThread.ManagedThreadId, data));
 }

Then I got to thinking what if I wanted the best of both worlds? Thanks to reflector I found out how BackgroundWorker’s RunWorkerCompleted event executes in the context of the calling thread. My generic ThreadBaseEx class offers two events: OnCompleteByThreadContext and OnCompleteByCallerContext.

 /// <summary>
 /// Abstract base class which performs some work and stores it in a data property
 /// </summary>
 /// <typeparam name="T">The type of data this thread will procure</typeparam>
 public abstract class ThreadBaseEx<T>
 {
 #region Private variables
 private AsyncOperation _asyncOperation;
 private readonly SendOrPostCallback _operationCompleted;
 #endregion

#region Ctor
 public ThreadBaseEx()
 {
 _operationCompleted = new SendOrPostCallback(AsyncOperationCompleted);
 }
 #endregion

#region Public methods
 /// <summary>
 /// Does the work asynchronously and fires the OnComplete event
 /// </summary>
 public void DoWorkAsync()
 {
 DoWorkAsync(null);
 }

 /// <summary>
 /// Does the work asynchronously and fires the OnComplete event
 /// </summary>
 /// <param name="arguement">The arguement object</param>
 public void DoWorkAsync(object arguement)
 {
 _asyncOperation = AsyncOperationManager.CreateOperation(null);
 ThreadPool.QueueUserWorkItem(DoWorkHelper, arguement);
 }

 /// <summary>
 /// Does the work and populates the Data property
 /// </summary>
 public void DoWork()
 {
 DoWork(null);
 }

 /// <summary>
 /// Does the work and populates the Data property
 /// </summary>
 /// <param name="arguement">The arguement object</param>
 /// <remarks>
 /// Can be called to run syncronously, which doesn't fire the OnComplete event
 /// </remarks>
 public abstract void DoWork(object arguement);
 #endregion

#region Private methods
 private void DoWorkHelper(object arguement)
 {
 DoWork(arguement);
 if (OnCompleteByThreadContext != null)
 OnCompleteByThreadContext.Invoke(this, Data);
 _asyncOperation.PostOperationCompleted(this._operationCompleted, arguement);
 }

private void AsyncOperationCompleted(object arg)
 {
 OnCompleteByCallerContext(this, Data);
 }
 #endregion

#region Properties
 public T Data { get; protected set; }
 #endregion

#region Events
 /// <summary>
 /// Delegate which is invoked when the thread has completed
 /// </summary>
 /// <param name="thread">The thread.</param>
 /// <param name="data">The data.</param>
 public delegate void ThreadComplete(ThreadBaseEx<T> thread, T data);

 /// <summary>
 /// Occurs when the thread completes.
 /// </summary>
 /// <remarks>This event operates in the context of the worker thread</remarks>
 public event ThreadComplete OnCompleteByThreadContext;

 /// <summary>
 /// Occurs when the thread completes.
 /// </summary>
 /// <remarks>This event operates in the context of the calling thread</remarks>
public event ThreadComplete OnCompleteByCallerContext;
 #endregion
 }

Your encapsulated thread will be the same as above, but now with two events allowing either scenario, depending on what suits.

Late binding DataGridView data with BackgroundWorker threads October 18, 2010

Posted by codinglifestyle in C#, Parallelism, Uncategorized, Winform.
Tags: , , ,
1 comment so far

In an increasingly multicore world you may notice your WinForm app never pushes your machine to 100%.  Great, right?  Erm, no.  Winforms are traditionally single threaded applications meaning we typically only tap into 1/2, 1/4, or even 1/8th of our processor’s potential.

I’ve recently been working on a utility containing a DataGridView for displaying work item data from TFS. Some of the column data had to be calculated so when displaying 500+ records the whole app was slowing down considerably. What I wanted was a delayed binding such that the cell would be initially blank, launch a thread, and update itself when the thread returned with the value. It turned out this was pretty easy.

First, use a data entity. You probably don’t have to, but I find having this layer offers an obvious place to add the changes I’ll cover below. The ideal place is in the bound property’s getter. Here you can see that the value is not yet calculated, launch a thread, and return blank or another default value in the meantime.

private int _nWeight = -1;

public int Weight

{

get

{

if (_nWeight < 0)

{

Tfs.GetWeight(Tag, GetWeightComplete);

_nWeight = 0;

}

return _nWeight;

}

}

private void GetWeightComplete(object sender, RunWorkerCompletedEventArgs e)

{

_nWeight = (int)e.Result;

if (Row < FormMain.Instance.Grid.Rows.Count)

FormMain.Instance.Grid.InvalidateRow(Row);

}

The property above represents the weight of the entity to be used in sorting or graphing by importance. Calculating the weight is a time intensive operation and is a great candidate for calculating in a worker thread. Notice a backing store, _nWeight, is used to check if the value has been calculated and also to cache the value. If _nWeight is uncached (-1) we launch the thread and return a default weight of 0 while the thread calculates the actual value. Notice when we call Tfs.GetWeight we pass the delegate, GetWeightComplete, as an argument. This function will ultimately be called when the thread returns.

public static void GetWeight(WorkItem wi, RunWorkerCompletedEventHandler onCompleteEvent)

{

BackgroundWorker worker    = new BackgroundWorker();

worker.DoWork             += new DoWorkEventHandler(GetWeightDoWork);

worker.RunWorkerCompleted += onCompleteEvent;

worker.RunWorkerAsync(wi);

}

private static void GetWeightDoWork(object sender, DoWorkEventArgs e)

{

WorkItem wi = (WorkItem)e.Argument;

int result = 0;

foreach (Revision rev in wi.Revisions)

{

if (rev.Fields[CoreField.ChangedBy].Value.ToString() == wi.Store.TeamFoundationServer.AuthenticatedUserDisplayName)

result += 1;

}

result = Math.Min(result, 10);

e.Result = result;

}

When a call is made to GetWeight you can see it uses the standard System.CompnentModel.BackgroundWorker class to manage the work. This has two main advantages: 1) an easy to use asynchronous event based pattern and 2) uses the thread pool for optimal thread management. Notice the two events, DoWork and RunWorkerCompleted are set before the thread is launched and that we can pass an arguement via RunWorkerAsync. GetWeightDoWork is called when the thread is launched and sets the result to the event arguments.  When we leave this function the RunWorkerCompleted event is called.

Finally, back in the data entity, GetWeightComplete is called when the thread has calculated the value.  The result is taken from the RunWorkercompletedEventArgs and set to the backing store. The form uses the singleton pattern and exposes the grid as a property (see here). This allows the data entity to easily invalidate the row which redraws the row taking the Weight value into account (in my case the weight determined the intensity of a yellow highlight drawn over the row indicating how often the authenticated user appeared in the work item’s revision history).

The user experience when using the above method is truely fantastic.  You get a responsive UI which immediately displays information with calculated information quickly coming in a few seconds later.  The standard binding method of the DataGridView further enhances this experience by only binding the data currently shown to the user.  So if only the first 25 rows are displayed, only those values will be calculated.  As we scroll down to show more rows the DataGridView will calculate only the newly bound rows (saving loads of time for potentially 1000’s of rows never shown).  Good luck unlocking your other cores for a better UI experience.

Yet Another VS2010 Overview June 18, 2010

Posted by codinglifestyle in ASP.NET, C#, Parallelism, Visual Studio 2010.
add a comment

Today I attended a mediocre presentation by Paul Fallen which looked stellar compared to the atrocious overview put on at the Galway VS2010 Launch Event.  Paul had the look of a man who had seen these slides many times and glossed over them at speed.  In fairness, he was using the same presentation deck I’ve seen since TechEd 2008.  I think we had all seen several flavours of this overview by this time, so nobody seemed to mind.  Below are the few snippets of information to add to the smorgasbord of other snippets I’ve gleaned from other talks of this nature.

Please click here for more comprehensive posts earlier on VS2010.

Here is the VS2010 Training Kit which was used in the demos.

  • Common Language Runtime
    • Latest version is CLR 4 (to go with .NET 4).
    • Previous version of CLR 2 encompassed .NET 2, 3, 3.5, 3.5SP1
    • Implications
      • App pool .NET Framework version
      • Incompatibilities running CLR frameworks side by side within same process
        • Think 3 COM objects accessing Outlook all using CLR1, 2, and 4
  • Managed Extensibility Framework (MEF)
    • Library in .NET that enables greater reuse of applications and components
  • VS2010 & C# 4.0
    • IDE
      • WPF editor – Ctrl + mouse wheel to zoom.  Handy for presentations
        • Box select (like command prompt selection)
      • Breakpoint labelling, import/export, Intellitrace (covered below)
      • Code navigation improvements (Ctrl + , and Ctrl + – for back)
      • Call Hierarchy
        • Allows you to visualize all calls to and from a selected method, property, or constructor
      • Improved Intellisense
        • Greatly improved javascript intellisense
        • Support for camel case
        • Can toggle (Ctrl + Space) between suggestive and consume first mode (handy for TDD)
      • Test run record, fast forward
      • Better multi-monitor support, docking enhancements
      • Tracking requirements and tasks as work items
    • Better control over ClientID
    • Routing moved out from MVP to general ASP.NET
    • Optional and named parameters
    • Improved website publishing, ClickOnce (see prev. posts)
  • Parallelism
    • Pillars
      • Task Parallel Library (TPL)
        • He didn’t touch at all on the new task concept
      • Parallel LINQ (PLINQ)
        • These are the extension methods to LINQ to turn query operators in to parallel operations.
          • var matches = from person in people.AsParallel()
          •               where person.FirstName == “Bob”
          •               select person;
      • System.Threading significant updates
      • Coordination Data Structures (CDS)
        • Lightweight and scalable thread-safe data structures and synchronization primitives
    • Toolset
      • Debugger: record and visualize threads
      • Visualizer: View multiple stacks
      • IntelliTrace – new capability to record execution, play it backwards and forwards, even email it to another engineer and have them reproduce the problem on their box
    • Other
      • Eventual depreciation of ThreadPool as higher level abstractions layer atop toolkit?
      • Unified cancellation using cancellation token
  • Dynamic Language Runtime (DLR)
    • New feature in CLR 4
    • Major new feature in C# 4 is dynamic type
      • What Linq was to C# 3.5
    • Adds shared dynamic type system, standard hosting model and support to make it easy to generate fast dynamic code
    • Big boost working with COM: type equivalence, embedded interop, managed marshalling
  • Windows Communication Framework (WCF)
    • Service discovery
      • Easier to discover endpoints
      • Imagine an IM chat program or devices that come and go
    • REST support via WCF WebHttp Services
      • Available in the code gallery templates
  •  

    Tech-ed 2008 November 17, 2008

    Posted by codinglifestyle in ASP.NET, C#, IIS, jQuery, Parallelism, Security, SharePoint, Visual Studio 2010.
    Tags: , , , , , , , , , , , , , , , , ,
    3 comments

    Last week I had the opportunity to attend TechEd 2008.  I have compiled a set of notes from the keynote and sessions I attended below.  Most of the information presented at these conferences is not really instructive for addressing today’s problems but talks about future problems and the technologies we will use to address them.  There are some interesting technologies coming down the pipe in the not so distant future and these notes may provide you with enough information to google more information about the topics which interest you.

     

    I skipped a lot of older information about the VS2008 release, C# v3.0, and Linq which can all be found here.

     

    Keynote

    ·         Testing Activity Center application

    o   Pillar: No more no-repro

    o   Generate test cases that tester can click off

    o   Bug recording including video, call stack, system information

    o   Generate a bug integrated in to Team System

    §  Can start up debugger and reproduce tester’s scenario

    §  Captures line of code, call stack, everything

    ·         Code buffering

    o   Method shows history of changes (graphically too)

    o   Integrates SCC versions in to IDE

    ·         MVC design pattern

    o   Model                   =              data

    o   View                     =              web page / UI

    o   Controller             =              logic

    ·         SharePoint Integration

    o   Server explorer includes lists, ect

    o   Webpart template automatically contains ascx control for design support

    o   SharePoint LINQ

    o   List Event wizard

    §  Auto-generate XML for site def??

    ·         Performance Profiler

    o   Pillar: Leverage multi-core systems

    o   See which method is taking time and core utilization

    §  Graphically shows core usage including drill down

    ·         Will help with concurrency, deadlock debugging, ect

    VS2008 Service Pack 1 Overview

    ·         ADO.NET Entity Framework release

    o   Very similar to Linq To SQL

    o   Generate data model

    §  conceptual model static (actual db) model

    o   Data Services

    §  Data centric abstraction over web services (WFC)

    §  Exposes and takes IQueryable so datasets very easy to work with in a LINQ like way

    §  Routing lets URI act like a Linq query

    ·         http://Root/my.svc/Customers/35/FirstName

    o   Dynamic Data

    §  Given a data model will create aspx accessibility to defined objects

    ·         Security: all objects off by default but can dynamically access entire data model

    ·         Allow CRUD access via ASPX templates applied to all objects

    o   CRUD = create, read, update, delete

    o   Can create individual page for certain object

    o   Can customize template to affect all objects

    ·         Ajax / other enhancements

    o   Ajax

    §  History Points

    ·         Addresses problem that users lose ability to hit back button

    §  Script combining

    ·         To improve performance allows to dynamically combine js libraries

    o   Improves javascript intellisense

    o   Improves web designer performance (bugs/regressions addressed)

    C# v4.0

    ·         History

    o   V1 – Managed Code big emphasis

    o   V2 – Generics; finished the language

    o   V3 – LINQ

    ·         Pillars

    o   Declarative programming: we are moving from “what?” to “how?”

    §  LINQ is an example of this

    o   Concurrency: Some of the parallelism extensions we will be getting

    o   Co-Evolution: VB and C# will more closely evolve together vs. Features hitting languages at different times

    o   Static vs. Dynamic Languages: aren’t necessarily a dichotomy

    §  Static: C++, C#, VB – anything compiles

    §  Dynamic: IronRuby, IronPython, Javascript

    ·         New keyword: dynamic

    o   Call any method of a dynamic object and the compiler won’t complain

    §  No intellisense possible

    §  Will call during runtime

    §  i.e.

    ·         dynamic calc = GetCalculator();

    ·         calc.Add(10,20);   //We know nothing about calc object

    §  Lots of power to  be explored here

    o   Optional Parameters

    §  Like in C++ (and apparently VB)

    §  Named parameters

    ·         Can also skip optional parameters

    ·         Public StreamReader OpenTextFile(string sFile, bool bReadOnly = true, int nBufferSize = 1024);

    ·         sr = OpenTextFile(“foo.txt”, buffersize:4096);

    o   COM Interoperability

    §  No more “ref dummy”!

    ·         Will get: doc.SaveAs(“Test.docx”);  //Winword saveas

    ·         Versus:   doc.SaveAs(“Test.docx”, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy, ref dummy);

    §  Automatic dynamic mapping so less unnecessary casting

    §  Interop type embedding

    ·         No more bringing in PIA

    o   Safe Co and Contra-variance

    o   Compiler as a service

    §  Compiler black box opened up to be used and extended

    §  In example created a command window with C#> prompt

    ·         Was able to define variables, functions, ect like in IronPython

    Ajax v4.0

    ·         Introduction

    o   Web app definition

    §  Web site is a static collection of pages (such a BBC news)

    §  Web application is something which replaces a traditional windows app

    o    Traditional Server-Side ASP.NET vs. AJAX

    §  Pros

    ·         Safe: Guaranteed browser compatibility

    ·         Powerful: All the power of a .NET language in code-behind

    §  Cons

    ·         Response: User must wait for postback

    ·         Performance: All page content rendered for each interaction

    ·         Update Panels: Use Wisely

    o   An update panel uses sneaky postbacks so while it looks better it is still as bad as traditional server side asp.net

    o   Don’t wrap an entire page in an update panel

    §  Wrap the smallest region required

    §  Use triggers to set what controls will fire a sneaky postback

    o   Turn ViewState OFF

    §  Down the line this will not be on by default

    §  We often send a lot of unnecessary information over the wire in ViewState

    ·         Ajax Calls (Services)

    o   Consider using an Ajax control to update data as needed

    o   Calling a web service from javascript is not considered dangerous or bad practice

    o   Example

    §  Have a datagrid with postback bound to a dropdown list.  Instead of a postback on ddlist use Ajax call

    ·         Instead of a datagrid use a straight html table

    ·         Via script we make a call to the web service

    ·         Use stringbuilder to format return to build up new rows

    §  Kinda horrible!  Too much mixing of mark-up and script

    ·         Client Side Controls

    o   Clean way of separating Ajax related script from the web page

    o   Allows you to bind to Ajax calls in a template way

    o   Example

    §  From above we now separate js in to a client side control which is now cleanly referenced on our web page

    ·         Declarative Client Side Controls

    o   “X” in XML stands for extensible; but not often extended!

    o   Use XML to bring in namespaces like System and DataView

    o   Can define a datagrid purely in html by adding attributes to the

    tag in a table

    ·         Fail over

    o   Problem with Ajax is not it is not always supported for reasons of accessibility, search engines, or disabled javascript (mobile devices)

    o   Does require double implementation of Ajax and traditional solution but it is an option when needed

    ·         New features in SP1

    o   Back button support!

    §  As of VS2008 SP1 Ajax now has back button support

    §  ScriptManager property EnableHistory=true and onNavigate event

    §  AddHistoryPoint(key,value);

    §  AddHistoryPoint(key,value,“Text seen in back button history instead of url”)

    §  Process

    ·         Enable history and add event

    ·         When page event fires store value (index, ect) with AddHistoryPoint() in provided history cache

    ·         Use history event to set page back up with value retrieved from HistoryEventArgs

    o   Example: set a form to display an item from the last selected index

    o   Script Combining

    §  Combine scripts for better performance

    ·         Example showed initial 15sec down to 3

    §  Must tell ScriptManager all libraries and it will combine/compress them in to one server call

    §  Must explicitly tell which scripts to use – even separate AJAX libraries

    ·         ScriptReferenceProfiler

    o   Free webcontrols which will tell you all the libraries a page uses to make the above less painful

    ·         Factoids

    o   Ajax initiative started to address Outlook Web Access (OWA); a good example of a web application

    o   Script Manager is just a way to make sure the page includes the Ajax javascript libraries

    §  Ajax script commands prefixed with $

    ·         $get(“my id”) looks to be handy

    §  Can dynamically add event handlers in javascript using Ajax js library

    ·         $addHandler($get(“dropdownlist1”), “change”, myFunc);

    ·         Cool “must have” tools

    o   Fiddler (www.fiddler2.com)

    §  Shows response time, requests/responses, statistics

    §  Tip: must place a dot in uri for Fiddler to capture localhost

    ·         http://localhost./default.aspx

    o   Firebug – Firefox extension

     

    Visual Studio Tips & Tricks

    ·         Ppt slides: http://code.msdn.microsoft.com/karenliuteched08

    ·         A lot more keyboard shortcuts: http://blogs.msdn.com/karenliu/

    ·         MS and partnered with DevExpress which is offering CodeRush Express for free

    o   Required for a lot of the shortcuts and refactoring shown

    ·         Editing

    o   Tools>Options>Editors>C#>Formatting>Set Other Spacing Options>Ignore Spaces

    o   Keyboard tricks

    §  Ctrl M,O               Toggle collapse all

    §  Ctrl M,M              Expand region

    §  F12                         Go to definition

    §  Shift F12              Final all references

    §  Ctrl Shift F8        Jump up Go to definition stack

    §  Ctrl [ or ]              Jump between brackets

    §  Ctrl Alt = or –      Smart Select

    §  Ctrl .                      See smart tag (Implement a missing function, add using statements)

    §   

    o   Snippets

    §  Lots of boilerplate goodies are there.  Really need to start using them

    ·         Ctor

    §  Lots more smart HTML snippets coming

    ·         Debugging

    o   Step OVER properties (r-click at breakpoint to check option)

    o   Step into Specific – list of all functions down the chain you can jump to step in to

    o   Tools

    §  Tinyget – mini stress test

    §  Adphang – get memory dump of w3wp

    §  Windbg – open dump

    ·         Loadby SOS mscorwks

    o   Need sos.dll for windbg to interpret stack

    ·         Deployment

    o   Web.config transform for release, uat, ect

    o   Powerful web deployment publishing options

    §  Http, ftp, fpse

    §  Msdeploypublish

    ·         New MS protocol for host supporting includes database, iis settings, access control lists (ACL), ect

    ·         Free test account at http://labs.discountasp.net/msdeploy

    ·         Other

    o   www.VisualStudioGallery.com  – IDE extensions gallery

    §  PowerCommands for VS08

    o   VS2008 SDK application

    §  Samples tab

    ·         Click to open sample straight in VS ready to go

    Silverlight v2 101

    ·         XAML

    o   A subset of WPF

    o   Read-only designer view

    §  Must edit  XAML by hand

    §  Proper designer on the way

    o   Can at least drag XAML text templates for many controls

    ·         Silverlight Controls

    o   Greatly extended in Silverlight v2

    §  Visit: www.silverlight.net for a demo

    §  Most of what you’d expect in ASP.NET is available in Silverlight

    o   Of Note

    §  StackPanel

    ·         Previously on Canvas available requiring static x,y position designation

    ·         Operates like a panel with z-order

    ·         Security

    o   Lives in a sandbox which can’t be extended for security reasons

    o   There are ways to safe access local (isolated) storage, have a file dialog, sockets, cross domain access

    ·         Nifty

    o   Can easily stream media content with one line of XAML

    o   Can easily spin any element

    Parallelism

    ·         Introduction

    o   Sequential performance has plateaued

    o   When we have 30 cores this may lead to dumber cores where we have a situation that today’s software runs slower on tomorrow’s hardware

    o   Need  to start thinking about parallelism

    §  Understand goals vs. usage

    §  Measure existing performance.  VS2010 has tools to do this

    §  Tuning Performance

    ·         Typically we start with sequential programming and add parallelism later

    ·         VS2010 has Profiler tool for tuning performance

    §  Identify opportunities for parallelism

    §  Use realistic datasets from the outset; not only on site with the customer

    §  Parallelize only when necessary, but PLAN for it as it does introduce race conditions, non-determinism, timing issues, and a slew of other potential bugs

    §  Once code is written for parallelism it can scale to any size automatically without any code changes

    ·         New technologies to help

    o   Parallel API

    §  Task

    ·         Like a thread but more optimal with a richer API

    o   Has a value for threads which must return a value

    §  Accessing the value automatically the same as Thread.Join or Task.Wait

    §  ThreadPool

    ·         Just pass a delegate and let Microsoft worry about the hardware and how to best allocate and spawn threads

    ·         The ideal number of threads = number of cores

    §  TimingBlock class makes it easy to test performance

    ·         No more: (end time – start time) / 1000

    §  Decorate code w/ measurement blocks which appear in Profiler

    o   Parallel Extensions

    §  First class citizen in VS2010 (SDK today?)

    §  Parallel.For and Parallel.ForEach

    ·         Still need to use critical sections around shared resources inside loop

    ·         Tip: Best practice is to parallelize the outer for loop only

    ·         Automatically adds measurement blocks to profiler to see results

    §  Parallel.Invoke

    §  Parallel extended IEnumerable to perform queries much faster

    ·         var q = from n in arr.AsParallel() where IsPrime(n) select n;

    §  Task group

    ·         i.e.  For a quick sort instead of using a recursive algorithm use task groups to leverage parallelism with little change to code

    o   Debugging – Parallel Stacks

    §  Richer API to display tasks or threads and view a holistic mapping of their execution

    o   Tools

    §  Performance Wizard

    ·         CPU sampling, timing, ect

    §  Profiler

    ·         Thread Blocking Analysis

    o   Shows each thread’s parallel execution revealing race conditions affecting performance

    §  Displays information about critical sections in tooltip

    §  Can show dependencies for resources/locks across threads

    jQuery

    ·         Ships in future VS but available now

    ·         Will not be changed by Microsoft but will be supported so we can use it with customers requiring support

    ·         VS intellisense available from jquery.com

    ·         Selectors

    1.       $(“:text”)             tag          Select all text boxes

    2.       $(.required)       class      Select any element with this class tag

    3.       $(“#name”)        id            Select with this ID

    ·         Animations

    1.       $(…).Show()

    2.       $(…).Hide()

    3.       $(…).slideDown()

    4.       $(…).slideUp()

    5.       $(…).fadeIn()

    6.       $(…).fadeOut

    7.       Massive open source libraries with hundreds more

    §  Plugins.jquery.com

    MVC 101

    ·         MVC

    o   Controller (input) pushes to model and view

    o   View (UI)

    o   Model (logic)

    ·         An alternative, not replacement, to traditional web forms

    ·         Easier to test

    o   No dependencies on request/response or viewstate as this everything is explicit and therefore testable

    ·         No server side controls (or designer support), postbacks, or events.

    o   Think back to classic ASP

    o   What is all this by-hand crap?  XAML (WPF and Silverlight) is only notepad as well

    ·         Action, instead of event, fires not in View but in the Controller. 

    o   The View, aka aspx page, has no code behind.

    ·         In Controller can define a action and use wizard to create it’s view (web page)

    ·         ViewUserControl is a collection of html and inline asp which is reusable

    IIS v7

    ·         Modules

    o   ASP.NET managed HttpModules can be plugged in directly to IIS v7

    §  No more unmanaged ISAPI filters

    o   Modules can be managed within IIS v7 Manager

    o   Configuration for modules can be exposed through manager

    §  Customer WinForm configuration can also be exposed

    ·         Config

    o   No more meta-base

    §  All settings exists in central applicationHost.config – similar to a web.config

    ·         C:\windows\system32\inetsrv\config\schema

    §  Can share IIS config for farm scenario

    o   www.iis.net contains a configuration pack which allows you to show the config file within the IIS manager

    Security

    ·         Concept of Security Development Lifecycle (SDL)

    ·         Threat Modelling – package available for formalized  security reviews

    o   Talks about prioritizing risks

    ·         Multi-Pass Review Model

    o   1 – Run fuzz and code analysis tools

    o   2 – Look for ‘patterns’ in riskier code

    o   3 – Deep review of riskiest code

    ·         Golden rule: What does the bad guy control?

    o   What if he controls x & j (resources obtained from user, port, pipeline, compromised file system or database)

    §  Char [] f = new char[3];

    §  f[3] = 0;                                 bug

    §  f[x] = 0;                                 can write a null to anywhere in memory

    §  f[x] = y;                                 can write anything anywhere in memory

    ·         Accepted encryption

    o   AES and SHAXXX only

    o   Everything else is banned!  So long TripleDES

    ·         Do not use:  try { } catch (Exception ex) { }

    o   Hides bugs and security flaws

    o   Catch only exceptions we can handle

    IE v8

    ·         Debug tools included out of the box

    o   Hit F12

    §  Debug javascript

    §  Solve style issues

    ·         Compatibility – new rendering engine following widely-accepted standard

    o   Get prepared for our apps look and feel to break

    o   www.msdn.com/iecompat

    o   Set meta-tag to tell IE8 to continue to render using v7 engine

    ·         Accelerators

    o   Can develop own accelerators which can highlight a name and pass to a website as a parameter.  Employee staff directory, for example.

    Cool Stuff

    ·         Ctrl-,

    o   Quick search feature in 2010

    ·         Ctrl-.

    o   Refactoring: infers using statement.  Generate a new method as your developing

    ·         Web.config

    o   Release version compiles debug/standard web.config and turns off debug, hardens security, replaces config and connection strings

    o   Part of the installer

    Other Stuff

    ·         Ribbon support in VS2008 Feature Pack

    ·         Vista Bridge

    o   Wrapper to get access to Vista controls and features

    o   TaskDialog and CommandLinks

    §  Standard now so will be seen in Win v7

    §  Backwards compatible, just extra messages to standard native button

    o   Restart/Recovery API

    §  Get notified of a reboot

    §  Register delegate called in separate thread when app crashes/reboots

    §  OS will run app with a command line argument you catch to load saved info

    o   Power Management

    §  Get notified about all power related info, low battery, ect

    Biz Stuff

    ·         StepUp Program

    o   Allows customers to upgrade current SKU

    §  i.e. VS Pro to Team Foundation Server

    §  30% discount until June 2009

    Multi-threaded WebService: “Unable to connect to remote server” April 24, 2007

    Posted by codinglifestyle in ASP.NET, IIS, Parallelism.
    Tags: , , , , ,
    2 comments

    You know you’ve made it in to hackerdom when 4000 ports just isn’t enough.  I need more power!

     

    I have a webservice which spawns, potentially thousands, of threads.  These in turn are calling a webservice in SharePoint to perform a real-time query (or else we could make a single call to the search service which relies on the index being up-to-date).  I did think to include a throttle which would restrict the total number of threads spawned across all calls to the webmethod.  However, even with this number safely at 100 threads I didn’t account for TCP/IP’s default settings keeping the port alive 4 minutes.  It didn’t take long to put around 4000 ports in a TIME_WAIT state.  When my webservice would make a call to the SharePoint webservice this would result in a System.Net.WebException:

     

    “Unable to connect to remote server” with an inner exception of:

     

    “Only one usage of each socket address (protocol/network address/port) is normally permitted”

     

    The solution was simple enough and is common across a number of greedy applications.  TCP/IP allows us to up the ante by changing a few parameters in the registry.  This allows you to adjust the delay before a port is available again.  In addition you may increase the number of ports at your disposal by nearly 60,000.  If this isn’t enough, maybe a design change is in order!

     

    Here’s how you do it:

     

    The product handles heavy query volumes more efficiently if the following TCP/IP parameters are set in the Windows® registry:

    1.       Start the registry editor:

    a.       Click the Windows Start button.

    b.       Click Run.

    c.       Type regedit in field provided.

    d.       Click OK

    2.       Use the following directory path to navigate to the registry key:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

    3.       In the right pane of the registry editor, look for the TcpTimedWaitDelay value name. If it is not there, add it by selecting Edit > New > DWORD Value from the menu bar. Type the value name TcpTimedWaitDelay in the name box that appears with the flashing cursor.

    Note: If you do not see the a flashing cursor and New Value # inside the box, right-click inside the right panel and select Rename from the menu, then type the value name TcpTimedWaitDelay in the name box.

    4.       Double-click inside the right pane again to set the value of TcpTimedWaitDelay. Select Decimal as the Base, and enter 30 in the Value data field.

    5.       In the right pane of the registry editor, look for the MaxUserPort value name. If it is not there, add it by selecting Edit > New > DWORD Value from the menu bar. Type the value name MaxUserPort in the name box that appears with the flashing cursor.

    Note: If you do not see the a flashing cursor and New Value # inside the box, right-click inside the right panel and select Rename from the menu, then type the value name TcpTimedWaitDelay in the name box.

    6.       Double-click inside the right pane again to set the value of MaxUserPort. Select Decimal as the Base, and enter 65534 in the Value data field.

    7.       You must restart Windows for these settings to take effect

     

    Reference: http://blogs.msdn.com/dgorti/archive/2005/09/18/470766.aspx

     

     

     

    Update! 

     

    After issuing the above changes were made and the customer finally rebooted the server I ran in to an new, exciting System.Net.WebException:

     

    The underlying connection was closed: An unexpected error occurred on a send.” with a status of: SendFailure

     

    Searching for this exception lead me to exactly the information I was looking for.  Let’s close down those ports as soon as we are done with them.  I have no desire to use up thousands of ports and wear the hacker crown.  We can do this by changing the keep alive state of our web request to false.  Funny that this isn’t by default false for a webservice nor is it a public member to set like the timeout.  We have two choices, the high road and the low road.  First the low road:

    We will alter generated proxy class directly; meaning your fix may be lost if you update your web reference.  In the GetWebRequest function the KeepAlive property must be set to false. This can be accomplished by following these steps:

    • Add a Web Reference using the normal way (if you haven’t already added one ofcourse).
    • Make sure Show All Files menu item is enable in the Project menu.
    • In the Solution Explorer window, navigate to:
      • Web References
          • Reference.map
            • Reference.cs (or .vb)
    • Open the Reference.cs file and add following code in the webservice proxy class:
      • protected override System.Net.WebRequest GetWebRequest(Uri uri)

        {

        System.Net.HttpWebRequest webRequest =

                        (System.Net.HttpWebRequest)base.GetWebRequest(uri);

         

              webRequest.KeepAlive       = false;

              webRequest.ProtocolVersion = HttpVersion.Version10;

         

              return webRequest;

        }

         

         

    The high road, or proper way of doing this, is to subclass our webservice such that we don’t touch the auto-generated proxy class.  Here is a sample: 

     

    using System;
    using System.Net;
    using System.Reflection;

    // Web service reference entered in wizard was “MyWebService.MyWebServiceWse”
    using MyProject.MyWebService;

    namespace MyProject
    {
     public class MySubClassedWebService : MyWebServiceWse
     {
      private static PropertyInfo requestPropertyInfo = null;

      public MySubClassedWebService(){}

      protected override System.Net.WebRequest GetWebRequest(Uri uri)
      {
       WebRequest request = base.GetWebRequest(uri);

       // Retrieve property info and store it in a static member for optimizing future use
       if (requestPropertyInfo==null)
        requestPropertyInfo = request.GetType().GetProperty(“Request”);

       // Retrieve underlying web request
       HttpWebRequest webRequest = (HttpWebRequest)requestPropertyInfo.GetValue(request, null);

       // Setting KeepAlive
       webRequest.KeepAlive = false;
       // Setting protocol version
       webRequest.ProtocolVersion = HttpVersion.Version10;
       return request;
      }
     }
    }

     

     

     

    Reference: http://weblogs.asp.net/jan/archive/2004/01/28/63771.aspx