Automation and testing to accelerate deployments in Azure.

Asynchronous Commands in Windows Store Apps

CONTACT US TODAY

The Model-View-View Model (MVVM) pattern is more popular than ever and is built into the Visual Studio templates for creating Windows Store apps. Developers familiar with Silverlight already encountered the platform shift to using asynchronous operations because it was impossible to generate a WCF client with synchronous methods. The Windows Runtime (WinRT) takes this further by dictating any operation that may potentially take longer than 50ms to complete should be asynchronous.

How does the MVVM pattern handle asynchronous operations, when the command interface ICommand only exposes synchronous methods?

namespace System.Windows.Input
{
     public interface ICommand
     {
         event EventHandler CanExecuteChanged;
         bool CanExecute(object parameter);
         void Execute(object parameter);
     }
}

Now consider a simple implementation of a command we’ll call an ActionCommand because it allows you to specify a delegate to perform and action when it is invoked. It also provides a predicate to condition the command and a public method to notify the command when the conditions for the predicate have changed.

namespace MyApp.Common
{
     using System;
     using System.Windows.Input;
     public class ActionCommand : ICommand
      {
         private readonly Action action;
         private readonly Func<bool> condition;

         public ActionCommand()
         {
             this.action = delegate { };
             this.condition = () => true;
         }
         public ActionCommand(Action action)
         {
             this.action = action;
             this.condition = () => true;
         }




         public ActionCommand(Action action, Func<bool> condition)
         {
             this.action = action;
             this.condition = condition;
         }
         

         public event EventHandler CanExecuteChanged = delegate { };
         public void RaiseExecuteChanged()
         {
             this.CanExecuteChanged(this, EventArgs.Empty);
         }
         public bool CanExecute(object parameter)
         {
             return this.condition();
         }
         public void Execute(object parameter)
   &nbsp

;     {
             this.action();
         }
     }
}

As you can see, there is no Task in the implementation of ICommand, nor any asynchronous code. As you are also aware, WinRT requires asynchronous code when you are performing various operations including a dialog. Here is an example of code that copies text and HTML to the clipboard and then shows a dialog to the end user they must confirm to acknowledge the copy was successful. The method is asynchronous.

private async Task Copy()
{
     var package = new DataPackage();
     package.SetText(this.DataManager.CurrentPage.Text);
     package.SetHtmlFormat(HtmlFormatHelper.CreateHtmlFormat
        (this.DataManager.CurrentPage.Html));
     Clipboard.SetContent(package);
     var dialog = new MessageDialog(
        "The web page was successfully copied to the clipboard.");
     await dialog.ShowAsync();
}

Now you have to wire it to the command implementation that is not asynchronous. How can you? Fortunately, the magic that is asynchronous code is able to combine forces with lambda expressions to enable you to handle asynchronous code “on the fly.” Here is the code to wire-up the command to call the Copy method asynchronously:

this.CopyCommand = new ActionCommand(
     async () => await this.Copy(),
     () => this.CopyEnabled);

That’s it. The action itself may be implemented as an asynchronous operation simply by invoking the async keyword and using the await operator. That’s how easy it is! While you should typically declare your interface consistently – for example, declaring them to return a Task when they should be implemented asynchronously – using this technique you can apply an asynchronous operation to the existing contract when needed. This means your commands can be asynchronous if and when needed, in full compliance with the WinRT guidelines.

Work at the Speed of Ideas in Azure.

We are not short on ideas and increasingly businesses want to implement them as quickly as possible. This is putting a burden on development teams to accelerate development without sacrificing quality.

We developed a best of breed platform designed specifically for Azure to enable end-to-end automation and testing. Our service accelerates the deployment of e-commerce sites, corporate websites and portals, and mobile web applications. Customers get to improve time-to-revenue with a reliable, predictable, and repeatable delivery platform.

Consistent through stages.

Version and release control.

Accelerate time-to-market.

We enable your teams to work in a logical and linear progression from inception to reality.

The platform is designed to facilitate a continuous delivery cycle using Agile methodologies.

You will streamline all aspects from identifying problems, rolling back to known good versions, and deploying at anytime of the day.

The Problem with Release Management.

Broken links impact Search Engine Optimization (SEO) which can easily reduce traffic to a site. More importantly, broken links have a direct impact on reputation, customer confidence, and completing a transaction. Broken links are a simple example of a very visible break down in testing and proper release management processes.

This is where automation and testing can become a catalyst to business but it is not as easy as it looks:

  • The tools to improve release management are complex, multi-origin, and rapidly changing
  • Not all are platform certified for public clouds such as Azure and can be unwieldy to deploy

As a result, many cut corners – they skip automation and don’t leverage testing, sometimes forgoing it altogether.

Request a Conversation

Put an End to Release Headaches.

We built this service for companies, e-tailers, and web development agencies who demand a better solution to ensure rapid development of content and features. It is ideally suited for automating the release and testing process for a Content Management System (CMS). Users benefit from the ability to:

  • Develop new features and capabilities faster and ensure they will not break the site or application as code gets promoted:
    • Linking to content (documents, videos, forms, etc.) that has been moved or deleted
    • Rapid corrective actions when functionality breaks
    • Event actions by trained experts using runbooks and/or automation
  • Reduce manual quality control (QC) processes:
    • Addresses the reality that most companies do not hire for this and often skip it
    • Catches bad code before it breaks or reduces functionality for live sites and applications
    • Key-based copying of databases from production to staging, test, and development without interrupting live environments
  • Evolve test coverage over time through an on-going consultative process:
    • As new functionality gets deployed, integrate as part of the automated testing plan
  • Manage code promotion across distributed locations:
    • Supports a centralized development model, allowing promotion of code to multiple production environments and across geo-distributed locations when required
    • As new functionality gets deployed, integrate as part of the automated testing plan

A Best of Breed Platform for Azure.

The Atmosera Release Management as a Service was developed to address the gap which exists for companies and developers wanting to move quickly through release management while ensuring quality control and repeatable testing procedures. The platform was purpose-built for Azure using productized integration code to seamlessly connect industry-leading products including:

  • Chef: infrastructure automation
  • Bitbucket: web-based projects hosting
  • Terraform: infrastructure as code
  • JIRA: bug tracking and project management
  • Jenkins: continuous integration and delivery management
  • Zabbix: real-time monitoring
  • Selenium: web application testing

Focus on your business and deploying the next release, not the infrastructure on which your automation and testing runs. Say goodbye to errors such as broken links!

Benefit from a Platform Based on DevOps Practices.

Agile and DevOps are all the rage but is your IT really enabling them properly?

Atmosera Release Management as a Service is a foundational platform on top of which your teams can drive better agility and quality. It was built for developers to ensure a framework where both infrastructure and operation are harmonized to deliver the ability to:

  • Track every change for every version and quickly find the source of a problem within your application
  • Leverage a structure which enables you to easily roll back to previous known good versions.
  • Log application feedback and add it to a backlog which can be prioritized for the planning phase of a future version.
  • Drive Continuous Integration (CI) which means you can deploy your application at any time without fear of losing data, customers, or other services related to your application.
  • Enable Continuous Deployment (CD) which allows your team to work effectively on an application with less downtime due to disruptions and distractions.
  • Put an end to the need to schedule software releases at 2AM on a Saturday.

We deliver solutions that accelerate the value of Azure.

Ready to experience the full power of Microsoft Azure?

Start Today

Blog Home

Stay Connected

Upcoming Events

All Events