Click here to Skip to main content
15,891,316 members
Articles / Desktop Programming / WPF

Introducing the Model Thread View Thread Pattern

Rate me:
Please Sign up or sign in to vote.
4.93/5 (69 votes)
1 May 2010BSD14 min read 165.7K   862   172  
Reduce threading code, and increase UI responsiveness with a new pattern extending MVVM.
<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 
    
    Version 2.0
    
    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.
    
    Example:
    
    ... ado.net/XML headers & schema ...
    <resheader name="resmimetype">text/microsoft-resx</resheader>
    <resheader name="version">2.0</resheader>
    <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
    <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
    <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
    <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
    <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
        <value>[base64 mime encoded serialized .NET Framework object]</value>
    </data>
    <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
        <comment>This is a comment</comment>
    </data>
                
    There are any number of "resheader" rows that contain simple 
    name/value pairs.
    
    Each data row contains a name, and value. The row also contains a 
    type or mimetype. Type corresponds to a .NET class that support 
    text/value conversion through the TypeConverter architecture. 
    Classes that don't support this are serialized and stored with the 
    mimetype set.
    
    The mimetype is used for serialized objects, and tells the 
    ResXResourceReader how to depersist the object. This is currently not 
    extensible. For a given mimetype the value must be set accordingly:
    
    Note - application/x-microsoft.net.object.binary.base64 is the format 
    that the ResXResourceWriter will generate, however the reader can 
    read any of the formats listed below.
    
    mimetype: application/x-microsoft.net.object.binary.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            : and then encoded with base64 encoding.
    
    mimetype: application/x-microsoft.net.object.soap.base64
    value   : The object must be serialized with 
            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
            : and then encoded with base64 encoding.

    mimetype: application/x-microsoft.net.object.bytearray.base64
    value   : The object must be serialized into a byte array 
            : using a System.ComponentModel.TypeConverter
            : and then encoded with base64 encoding.
    -->
  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
    <xsd:element name="root" msdata:IsDataSet="true">
      <xsd:complexType>
        <xsd:choice maxOccurs="unbounded">
          <xsd:element name="metadata">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" />
              </xsd:sequence>
              <xsd:attribute name="name" use="required" type="xsd:string" />
              <xsd:attribute name="type" type="xsd:string" />
              <xsd:attribute name="mimetype" type="xsd:string" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="assembly">
            <xsd:complexType>
              <xsd:attribute name="alias" type="xsd:string" />
              <xsd:attribute name="name" type="xsd:string" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="data">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
              <xsd:attribute ref="xml:space" />
            </xsd:complexType>
          </xsd:element>
          <xsd:element name="resheader">
            <xsd:complexType>
              <xsd:sequence>
                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
              </xsd:sequence>
              <xsd:attribute name="name" type="xsd:string" use="required" />
            </xsd:complexType>
          </xsd:element>
        </xsd:choice>
      </xsd:complexType>
    </xsd:element>
  </xsd:schema>
  <resheader name="resmimetype">
    <value>text/microsoft-resx</value>
  </resheader>
  <resheader name="version">
    <value>2.0</value>
  </resheader>
  <resheader name="reader">
    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <resheader name="writer">
    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
  </resheader>
  <data name="DefaultTextLoggerPattern" xml:space="preserve">
    <value>{1}: {2}. Priority: {3}. Timestamp:{0:u}.</value>
  </data>
  <data name="DependencyForUnknownModule" xml:space="preserve">
    <value>Cannot add dependency for unknown module {0}</value>
  </data>
  <data name="DependencyOnMissingModule" xml:space="preserve">
    <value>A module declared a dependency on another module which is not declared to be loaded. Missing module(s): {0}</value>
  </data>
  <data name="DirectoryNotFound" xml:space="preserve">
    <value>Directory {0} was not found.</value>
  </data>
  <data name="DuplicatedModule" xml:space="preserve">
    <value>A duplicated module with name {0} has been found by the loader.</value>
  </data>
  <data name="DuplicatedModuleGroup" xml:space="preserve">
    <value>A duplicated module group with name {0} has been found by the loader.</value>
  </data>
  <data name="FailedToLoadModule" xml:space="preserve">
    <value>An exception occurred while initializing module '{0}'. 
    - The exception message was: {2}
    - The Assembly that the module was trying to be loaded from was:{1}
    Check the InnerException property of the exception for more information. If the exception occurred while creating an object in a DI container, you can exception.GetRootException() to help locate the root cause of the problem. 
  </value>
  </data>
  <data name="FailedToLoadModuleNoAssemblyInfo" xml:space="preserve">
    <value>An exception occurred while initializing module '{0}'. 
    - The exception message was: {1}
    Check the InnerException property of the exception for more information. If the exception occurred 
    while creating an object in a DI container, you can exception.GetRootException() to help locate the 
    root cause of the problem. </value>
  </data>
  <data name="InvalidArgumentAssemblyUri" xml:space="preserve">
    <value>The argument must be a valid absolute Uri to an assembly file.</value>
  </data>
  <data name="FailedToRetrieveModule" xml:space="preserve">
    <value>Failed to load type for module {0}. Error was: {1}.</value>
  </data>
  <data name="InvalidDelegateRerefenceTypeException" xml:space="preserve">
    <value>The Target of the IDelegateReference should be of type {0}.</value>
  </data>
  <data name="ModuleNotFound" xml:space="preserve">
    <value>Module {0} was not found in the catalog.</value>
  </data>
  <data name="ModuleTypeNotFound" xml:space="preserve">
    <value>Failed to load type '{0}' from assembly '{1}'.</value>
  </data>
  <data name="NoRetrieverCanRetrieveModule" xml:space="preserve">
    <value>There is currently no moduleTypeLoader in the ModuleManager that can retrieve the specified module.</value>
  </data>
  <data name="RegionNotFound" xml:space="preserve">
    <value>This RegionManager does not contain a Region with the name '{0}'.</value>
  </data>
  <data name="StringCannotBeNullOrEmpty" xml:space="preserve">
    <value>The provided String argument {0} must not be null or empty.</value>
  </data>
  <data name="ModuleDependenciesNotMetInGroup" xml:space="preserve">
    <value>Module {0} depends on other modules that don't belong to the same group.</value>
  </data>
  <data name="RegionManagerWithDifferentNameException" xml:space="preserve">
    <value>The region being added already has a name of '{0}' and cannot be added to the region manager with a different name ('{1}').</value>
  </data>
  <data name="StartupModuleDependsOnAnOnDemandModule" xml:space="preserve">
    <value>Module {0} is marked for automatic initialization when the application starts, but it depends on modules that are marked as OnDemand initialization. To fix this error, mark the dependency modules for InitializationMode=WhenAvailable, or remove this validation by extending the ModuleCatalog class.</value>
  </data>
  <data name="ModulePathCannotBeNullOrEmpty" xml:space="preserve">
    <value>The ModulePath cannot contain a null value or be empty</value>
  </data>
  <data name="IEnumeratorObsolete" xml:space="preserve">
    <value>The IModuleEnumerator interface is no longer used and has been replaced by ModuleCatalog.</value>
  </data>
  <data name="ConfigurationStoreCannotBeNull" xml:space="preserve">
    <value>The ConfigurationStore cannot contain a null value. </value>
  </data>
  <data name="CyclicDependencyFound" xml:space="preserve">
    <value>At least one cyclic dependency has been found in the module catalog. Cycles in the module dependencies must be avoided.</value>
  </data>
  <data name="FailedToGetType" xml:space="preserve">
    <value>Unable to retrieve the module type {0} from the loaded assemblies.  You may need to specify a more fully-qualified type name.</value>
  </data>
  <data name="ValueMustBeOfTypeModuleInfo" xml:space="preserve">
    <value>The value must be of type ModuleInfo.</value>
  </data>
</root>

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The BSD License


Written By
Engineer
Switzerland Switzerland
Daniel is a former senior engineer in Technology and Research at the Office of the CTO at Microsoft, working on next generation systems.

Previously Daniel was a nine-time Microsoft MVP and co-founder of Outcoder, a Swiss software and consulting company.

Daniel is the author of Windows Phone 8 Unleashed and Windows Phone 7.5 Unleashed, both published by SAMS.

Daniel is the developer behind several acclaimed mobile apps including Surfy Browser for Android and Windows Phone. Daniel is the creator of a number of popular open-source projects, most notably Codon.

Would you like Daniel to bring value to your organisation? Please contact

Blog | Twitter


Xamarin Experts
Windows 10 Experts

Comments and Discussions