Tuesday, April 12, 2016

Different ways to use TASK in .NET C#

New threads can be started using the Task Programming Library in .NET in – at last – 5 different ways.

You’ll first need to add the following using statement:

using System.Threading.Tasks;
 
The most direct way

Task.Factory.StartNew(() => {Console.WriteLine("Hello Task library!"); });

Using Action
Task task = new Task(new Action(PrintMessage));
task.Start();

where PrintMessage is a method:

private void PrintMessage()
{
    Console.WriteLine("Hello Task library!");
}


Using a delegate
Task task = new Task(delegate { PrintMessage(); });
task.Start();

Lambda and named method
Task task = new Task( () => PrintMessage() );
task.Start();

Lambda and anonymous method
Task task = new Task( () => { PrintMessage(); } );
task.Start();

Using Task.Run in .NET4.5

public async Task DoWork()
{
    await Task.Run(() => PrintMessage());
}

Using Task.FromResult in .NET4.5 to return a result from a Task

public async Task DoWork()
{
    int res = await Task.FromResult<int>(GetSum(4, 5));  
}

private int GetSum(int a, int b)
{
    return a + b;
}

 You cannot start a task that has already completed. If you need to run the same task you’ll need to initialise it again.


Thursday, January 21, 2016

Translate Website to Another Language using Google Language API

Create An Enum Class

First, we will create our own enum class for the languages based from Google's Languages Enum, as mentioned and shown above. This is really straight forward. See the code below:

1 using System;
 2
 3 public class Language
 4 {
 5     public const string AFRIKAANS = "af";
 6     public const string ALBANIAN = "sq";
 7     public const string AMHARIC = "am";
 8     public const string ARABIC = "ar";
 9     public const string ARMENIAN = "hy";
10     public const string AZERBAIJANI = "az";
11     public const string BASQUE = "eu";
12     public const string BELARUSIAN = "be";
13     public const string BENGALI = "bn";
14     public const string BIHARI = "bh";
15     public const string BULGARIAN = "bg";
16     public const string BURMESE = "my";
17     public const string CATALAN = "ca";
18     public const string CHEROKEE = "chr";
19     public const string CHINESE = "zh";
20     public const string CHINESE_SIMPLIFIED = "zh-CN";
21     public const string CHINESE_TRADITIONAL = "zh-TW";
22     public const string CROATIAN = "hr";
23     public const string CZECH = "cs";
24     public const string DANISH = "da";
25     public const string DHIVEHI = "dv";
26     public const string DUTCH = "nl";
27     public const string ENGLISH = "en";
28     public const string ESPERANTO = "eo";
29     public const string ESTONIAN = "et";
30     public const string FILIPINO = "tl";
31     public const string FINNISH = "fi";
32     public const string FRENCH = "fr";
33     public const string GALICIAN = "gl";
34     public const string GEORGIAN = "ka";
35     public const string GERMAN = "de";
36     public const string GREEK = "el";
37     public const string GUARANI = "gn";
38     public const string GUJARATI = "gu";
39     public const string HEBREW = "iw";
40     public const string HINDI = "hi";
41     public const string HUNGARIAN = "hu";
42     public const string ICELANDIC = "is";
43     public const string INDONESIAN = "id";
44     public const string INUKTITUT = "iu";
45     public const string ITALIAN = "it";
46     public const string JAPANESE = "ja";
47     public const string KANNADA = "kn";
48     public const string KAZAKH = "kk";
49     public const string KHMER = "km";
50     public const string KOREAN = "ko";
51     public const string KURDISH = "ku";
52     public const string KYRGYZ = "ky";
53     public const string LAOTHIAN = "lo";
54     public const string LATVIAN = "lv";
55     public const string LITHUANIAN = "lt";
56     public const string MACEDONIAN = "mk";
57     public const string MALAY = "ms";
58     public const string MALAYALAM = "ml";
59     public const string MALTESE = "mt";
60     public const string MARATHI = "mr";
61     public const string MONGOLIAN = "mn";
62     public const string NEPALI = "ne";
63     public const string NORWEGIAN = "no";
64     public const string ORIYA = "or";
65     public const string PASHTO = "ps";
66     public const string PERSIAN = "fa";
67     public const string POLISH = "pl";
68     public const string PORTUGUESE = "pt-PT";
69     public const string PUNJABI = "pa";
70     public const string ROMANIAN = "ro";
71     public const string RUSSIAN = "ru";
72     public const string SANSKRIT = "sa";
73     public const string SERBIAN = "sr";
74     public const string SINDHI = "sd";
75     public const string SINHALESE = "si";
76     public const string SLOVAK = "sk";
77     public const string SLOVENIAN = "sl";
78     public const string SPANISH = "es";
79     public const string SWAHILI = "sw";
80     public const string SWEDISH = "sv";
81     public const string TAJIK = "tg";
82     public const string TAMIL = "ta";
83     public const string TAGALOG = "tl";
84     public const string TELUGU = "te";
85     public const string THAI = "th";
86     public const string TIBETAN = "bo";
87     public const string TURKISH = "tr";
88     public const string UKRAINIAN = "uk";
89     public const string URDU = "ur";
90     public const string UZBEK = "uz";
91     public const string UIGHUR = "ug";
92     public const string VIETNAMESE = "vi";
93     public const string UNKNOWN = "";
94
95     public Language()
96     {
97     }
98 }

The Translation Method

We will also create a method that returns a translated string. In this example, the method is inside my test ASP.NET Page, that's why it's private, I recommend moving it to a public class, and make it static so other pages will have access to this method.

30 private string Translate(string stringToTranslate,
         string fromLanguage, string toLanguage)
31 {
32     // make sure that the passed string is not empty or null
33     if (!String.IsNullOrEmpty(stringToTranslate))
34     {
35         // per Google's terms of use, we can only translate
36         // a string of up to 5000 characters long
37         if (stringToTranslate.Length <= 5000)
38         {
39             const int bufSizeMax = 65536;
40             const int bufSizeMin = 8192;
41
42             try
43             {
44                 // by default format? is text.
         // so we don't need to send a format? key
45                 string requestUri = "http://ajax.googleapis.com/
             ajax/services/language/translate?v=1.0&q=" +
46                     stringToTranslate + "&langpair=" +
47                     fromLanguage + "%7C" + toLanguage;
48
49                 // execute the request and get the response stream
50                 HttpWebRequest request =
             (HttpWebRequest)WebRequest.Create(requestUri);
51                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
52                 Stream responseStream = response.GetResponseStream();
53
54                 // get the length of the content returned by the request
55                 int length = (int)response.ContentLength;
56                 int bufSize = bufSizeMin;
57
58                 if (length > bufSize)
59                     bufSize = length > bufSizeMax ? bufSizeMax : length;
60
61                 // allocate buffer and StringBuilder for reading response
62                 byte[] buf = new byte[bufSize];
63                 StringBuilder sb = new StringBuilder(bufSize);
64
65                 // read the whole response
66                 while ((length = responseStream.Read(buf, 0, buf.Length)) != 0)
67                 {
68                     sb.Append(Encoding.UTF8.GetString(buf, 0, length));
69                 }
70
71                 // the format of the response is like this
72                 // {"responseData": {"translatedText":"¿Cómo estás?"},
             "responseDetails": null, "responseStatus": 200}
73                 // so now let's clean up the response by manipulating the string
74                 string translatedText = sb.Remove(0, 36).ToString();
75                 translatedText = translatedText.Substring(0,
                 translatedText.IndexOf("\"},"));
76
77                 return translatedText;
78             }
79             catch
80             {
81                 return "Cannot get the translation.  Please try again later.";
82             }
83         }
84         else
85         {
86             return "String to translate must be less than 5000 characters long.";
87         }
88     }
89     else
90     {
91         return "String to translate is empty.";
92     }
93 }


Notice that the method accepts three (3) parameters; the string to translate, the language to translate from, and the language to translate to. The most important part of this code can be seen in lines 45-52. Lines 45-47 build a URL that sends a request and gets the response shown in lines 50-52. Because we're accessing the API via Google's Rest Interface, the response is returned through a Stream object. This is a lot easier to code as compared to web services. The returned string encoded from the stream is cleaned-up (lines 74-75) and returned as the translated string

Ready to Translate

Translating is again very straight forward. We simply call the Translate method that we built above to get translated strings.

 9 protected void Page_Load(object sender, EventArgs e)
10 {
11     string stringToTranslate = "Where do you live?
             What's your name?  My name is Junnark.";
12     Response.Write("<b>English:</b> " + stringToTranslate + "<br/><br/>");
13
14     string translatedString =
     Translate(stringToTranslate, Language.ENGLISH, Language.FILIPINO);
15     Response.Write("<b>Filipino:</b> " + translatedString + "<br/><br/>");
16
17     translatedString =
     Translate(stringToTranslate, Language.ENGLISH, Language.SPANISH);
18     Response.Write("<b>Spanish:</b> " + translatedString + "<br/><br/>");
19
20     translatedString =
     Translate(stringToTranslate, Language.ENGLISH, Language.CHINESE);
21     Response.Write("<b>Chinese:</b> " + translatedString + "<br/><br/>");
22
23     translatedString =
     Translate(stringToTranslate, Language.ENGLISH, Language.FRENCH);
24     Response.Write("<b>French:</b> " + translatedString + "<br/><br/>");
25
26     translatedString =
     Translate(stringToTranslate, Language.ENGLISH, Language.JAPANESE);
27     Response.Write("<b>Japanese:</b> " + translatedString + "<br/><br/>");
28 }