/// <summary>
        /// Construct a user agent header - synchronized.
        /// </summary>
        /// <param name="applicationName">Escaped application name.</param>
        /// <param name="applicationVersion">Escaped application version.</param>
        /// <param name="programmingLanguage">Escaped programming language.</param>
        /// <param name="additionalNameValuePairs">Raw attribute name,value pair.</param>
        public void SetUserAgent(string applicationName, string applicationVersion, string programmingLanguage, string[] additionalNameValuePairs)
        {
            lock (_lockThis)
            {
                if (applicationName == null)
                {
                    throw new ArgumentNullException("applicationName", "Value cannot be null.");
                }

                if (applicationVersion == null)
                {
                    throw new ArgumentNullException("applicationVersion", "Value cannot be null.");
                }

                if (programmingLanguage == null)
                {
                    throw new ArgumentNullException("programmingLanguage", "Value cannot be null.");
                }

                if (additionalNameValuePairs.Length % 2 != 0)
                {
                    throw new ArgumentException("additionalNameValuePairs", "Every name must have a corresponding value.");
                }

                var sb = new StringBuilder();
                sb.Append(applicationName);
                sb.Append("/");
                sb.Append(applicationVersion);
                sb.Append(" (");
                sb.Append("Language=");
                sb.Append(programmingLanguage);
                var i = 0;
                while (i < additionalNameValuePairs.Length)
                {
                    var name  = additionalNameValuePairs[i];
                    var value = additionalNameValuePairs[++i];
                    sb.Append("; ");
                    sb.Append(MwsUtil.EscapeAttributeName(name));
                    sb.Append("=");
                    sb.Append(MwsUtil.EscapeAttributeValue(value));
                    i++;
                }

                sb.Append(")");
                _userAgent = sb.ToString();
            }
        }