Blog Archives
TPL Task Parrallel Library .net 4.0 parallel programming multi thread threading task queue user work item
//simple parallel function call Parallel.Invoke(() => somefunc1(), () => somefunc2()); //parallel foreach with two lists new List<List> tasks = new List<List>() { new List() { new DataSource1ProcessorA() }, new List() { new DataSource2ProcessorA(), new DataSource2ProcessorB() } } Parallel.ForEach(tasks, (items) => { foreach (var item in items) { item.GetData(); item.Process(); } }); //new task static factory method approach Task.Factory.StartNew(() => { data.GetData(); data.Process(); }) .ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception), TaskContinuationOptions.OnlyOnFaulted); //explicit object oriented // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () => Console.WriteLine("Hello from taskA.")); // Start the task. taskA.Start(); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait(); //using task run Thread.CurrentThread.Name = "Main"; // Define and run the task. Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA.")); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", Thread.CurrentThread.Name); taskA.Wait();
References
http://msdn.microsoft.com/en-us/library/dd460705.aspx
(added 20121023 good comprehensive resource with illustrative examples)
http://www.codeproject.com/Articles/362996/Multi-core-programming-using-Task-Parallel-Library
http://www.codeproject.com/KB/threads/ParallelTasks.aspx
Optimize Managed Code For Multi-Core Machines
http://msdn.microsoft.com/en-us/magazine/cc163340.aspx
good blog
http://www.codethinked.com/net-40-and-systemthreadingtasks
queueuserworkitem
http://msdn.microsoft.com/en-us/library/4yd16hza.aspx
threadpool class
http://msdn.microsoft.com/en-us/library/y5htx827.aspx
task class
http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx
task parrallelism
http://msdn.microsoft.com/en-us/library/dd537609.aspx
How to: Use Parallel.Invoke to Execute Parallel Operations
http://msdn.microsoft.com/en-us/library/dd460705.aspx
Custom DAL Class SQL ORM ASP .NET
(common.DataObject may be of your choosing or may simply replace with dynamic)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Web.UI.WebControls; using System.Web.UI; using System.Data.SqlClient; using AIS.Common; //this is a common namespace I use in examples throughout my site using System.Reflection; using System.Dynamic; //TODO: consider returning ienumerable in sp return values for lazy eval vs .tolist immediate eval namespace AIS.DAL.AppName { public static class StoredProcedures { public delegate void ErrorHandler(Exception ex); /// <summary> /// If no custom error handling is bound to this event, exceptions will be thrown back up to the calling function. /// If custom handling is bound to this event, ensure it does not perform a redirect or kill the thread unless you intend to abort the procedural /// steps following the method/function call which threw the error. /// </summary> public static event ErrorHandler HandleError; #region Unique Procedures public static List<Common.DataObject> LoadUserSessions_All(dynamic o) { return ExecuteRead("an_get_db_fn1", o); } public static List<Common.DataObject> LoadUserSessionsDetails_LiveStream(dynamic o) { return ExecuteRead("an_get_db_fn2", o); } public static List<Common.DataObject> LoadUserSessionsDetails_Live(dynamic o) { return ExecuteRead("an_get_db_fn3", o); } public static int LogChat() { return ExecuteScalar("an_get_db_fn4", null); } public static int LogError() { return ExecuteScalar("an_get_db_fn5", null); } #endregion //TODO: consider hiding from external assemblies which would require strong mappings above #region Execution Logic public static List<Common.DataObject> ExecuteRead(string procedurename, dynamic param) { try { SqlDataSource sds = new SqlDataSource(); sds.ConnectionString = ConfigValues.TrainingPortalConnectionString; sds.SelectCommandType = SqlDataSourceCommandType.StoredProcedure; sds.SelectCommand = procedurename; if (param != null) { foreach (PropertyInfo pi in param.GetType().GetProperties()) { object pval = pi.GetValue(param, null); if (pval != null) { sds.SelectParameters.Add(pi.Name, pval.ToString()); } } } List<Common.DataObject> results = new List<Common.DataObject>(); //sds.Select(new DataSourceSelectArguments()).Cast<DataRowView>().ToList().ForEach(o => Load_AddResult<dynamic>(o, ref results)); sds.Select(new DataSourceSelectArguments()).Cast<DataRowView>().ToList().ForEach(o => Load_AddResult<Common.DataObject>(o, ref results)); return results; } catch (Exception ex) { HandleError_Condensed(ex); return null; } } public static void Load_AddResult<t>(Common.DataObject o, ref List<t> results) { try { t r = (t)Activator.CreateInstance(typeof(t)); foreach (PropertyInfo pi in typeof(t).GetProperties()) { object v = o[pi.Name].ToString(); Type pt = Type.GetType(pi.PropertyType.FullName); //try { pi.SetValue(r, Convert.ChangeType(v, pt), null); } //catch (Exception ex) { HandleError_Condensed(ex); } o.Add(pi.Name, Convert.ChangeType(v, pt)); } results.Add(r); } catch (Exception ex) { HandleError_Condensed(ex); } } //public static void Load_AddResult<t>(dynamic o, ref List<t> results) //{ // try // { // t r = (t)Activator.CreateInstance(typeof(t)); // foreach (PropertyInfo pi in typeof(t).GetProperties()) // { // object v = o[pi.Name].ToString(); // Type pt = Type.GetType(pi.PropertyType.FullName); // try { pi.SetValue(r, Convert.ChangeType(v, pt), null); } // catch (Exception ex) { HandleError_Condensed(ex); } // } // results.Add(r); // } // catch (Exception ex) // { // HandleError_Condensed(ex); // } //} public static void ExecuteNonScalar(string procedurename, dynamic param) { try { ExecuteScalar(procedurename, param); } catch (Exception ex) { HandleError_Condensed(ex); } } public static int ExecuteScalar(string procedurename, dynamic param) { try { SqlDataSource sds = new SqlDataSource(); sds.ConnectionString = ConfigValues.TrainingPortalConnectionString; sds.UpdateCommandType = SqlDataSourceCommandType.StoredProcedure; sds.UpdateCommand = procedurename; if (param != null) { foreach (PropertyInfo pi in param.GetType().GetProperties()) { object pval = pi.GetValue(param, null); if (pval != null) { sds.SelectParameters.Add(pi.Name, pval.ToString()); } } } return sds.Update(); } catch (Exception ex) { HandleError_Condensed(ex); return 1; //1 signifies error in tsql } } #endregion private static void HandleError_Condensed(Exception ex) { if (HandleError != null) { HandleError(ex); } else { throw new Exception(ex.Message, ex); } } } }
Custom AWS S3 Helper Class AWSSDK Wrapper
Implements some very commonly used AWS S3 functionality. (need to merge with my other AWS wrapper classes, Route53, EC2, etc)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO; using System.Collections.Specialized; using System.Configuration; //uses AWSSDK.dll from amazon using Amazon; using Amazon.S3; using Amazon.S3.Model; using System.Xml.Linq; using System.Xml; using System.Data; namespace AIS.Common { public static class AWSHelper { private static List<S3Bucket> LoadS3Buckets() { System.Collections.Specialized.NameValueCollection appConfig = System.Configuration.ConfigurationManager.AppSettings; using (var s3client = Amazon.AWSClientFactory.CreateAmazonS3Client(ConfigValues.AWSAccessKey, ConfigValues.AWSSecretKey)) { return s3client.ListBuckets().Buckets; } } private static List<S3Object> LoadS3Objects(string bucketname) { System.Collections.Specialized.NameValueCollection appConfig = System.Configuration.ConfigurationManager.AppSettings; using (var s3client = Amazon.AWSClientFactory.CreateAmazonS3Client(ConfigValues.AWSAccessKey, ConfigValues.AWSSecretKey)) { return s3client.ListObjects(new ListObjectsRequest() { BucketName = bucketname }).S3Objects; } } private static void LoadS3File(string bucketname, string keyname, HttpResponse response, string contenttype) { NameValueCollection appConfig = ConfigurationManager.AppSettings; using (var s3client = Amazon.AWSClientFactory.CreateAmazonS3Client(ConfigValues.AWSAccessKey, ConfigValues.AWSSecretKey)) { GetObjectRequest s3request = new GetObjectRequest() .WithBucketName(bucketname).WithKey(keyname); using (GetObjectResponse s3response = s3client.GetObject(s3request)) { string title = s3response.Metadata["x-amz-meta-title"]; response.Clear(); //Response.Write(string.Format("The object's title is {0}", title)); //Response.AddHeader //Response.ContentType="application/swf"; ////Response.ContentType="contenttype"; response.ContentType = s3response.ContentType; //s3response.Headers["Content-Length"]; long filesize = s3response.ContentLength; byte[] buffer = new byte[(int)filesize]; response.BinaryWrite(ConvertStreamToBytes(s3response.ResponseStream, filesize)); response.Flush(); response.Close(); } } } public static string GetS3UrlToVideo(string bucketname, string keyname) { System.Collections.Specialized.NameValueCollection appConfig = System.Configuration.ConfigurationManager.AppSettings; string url = ""; using (var s3client = Amazon.AWSClientFactory.CreateAmazonS3Client(ConfigValues.AWSAccessKey, ConfigValues.AWSSecretKey)) { Amazon.S3.Model.GetPreSignedUrlRequest request = new Amazon.S3.Model.GetPreSignedUrlRequest() .WithBucketName(bucketname) .WithKey(keyname) .WithProtocol(Amazon.S3.Model.Protocol.HTTP) .WithVerb(HttpVerb.GET) .WithExpires(DateTime.Now.AddMinutes(ConfigValues.VideoURLExpiration)); Amazon.S3.Model.GetPreSignedUrlRequest r = new GetPreSignedUrlRequest(); url = s3client.GetPreSignedURL(request); url= "https://s3.amazonaws.com/" + bucketname + keyname; } //return System.Xml.XmlConvert.EncodeName(url); return url; } public static byte[] ConvertStreamToBytes(Stream input, long filesize) { byte[] buffer = new byte[(int)filesize]; using (MemoryStream ms = new MemoryStream()) { int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, read); } return ms.ToArray(); } } } }
Custom Web.Config Wrapper Class ASP .NET
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Configuration; namespace AIS.Common { public class ConfigValues { #region appSettings public static string SomeStringOne { get { return getval("SomeStringOne "); } } public static string SomeStringTwo { get { return getval("SomeStringTwo "); } } public static string Env { get { return getval("env"); } } //keep in mind case sensitivity public static string LastManualRefresh { get { return getval("date_last_manual_refresh"); } } //useful for manual site refresh/reload public static double SomeDouble { get { return Convert.ToDouble(getval("some_static_double")); } } #endregion #region connectionStrings - update web.config env variable to toggle between dev and prd public static string YourDBOneConnectionString { get { return getcstr("win_web_db"); } } //also read only implementation like above, but illustrates environment variable usage specific in web.config useful if you have many environments public static string YourDBTwoConnectionString { get { if (Env.ToLower().ToString() != "filesystem") { return getcstr("static_string" + Env.ToLower().ToString()); } return ""; } } #endregion /// <summary> /// Retrieve Connection String for specified provided key /// </summary> /// <param name="key"></param> /// <returns></returns> private static string getcstr(string key) { try { return ConfigurationManager.ConnectionStrings[key].ConnectionString; } catch (Exception ex) { Shared.HandleError(ex); //TODO: change to throw error event handle instead of direct call for reusability return "Error retrieving value"; } } /// <summary> /// Retrieve appSettings value for provided specified key /// </summary> /// <param name="key"></param> /// <returns></returns> private static string getval(string key) { try { return ConfigurationManager.AppSettings[key]; } catch (Exception ex) { Shared.HandleError(ex); //TODO: change to throw error event handle instead of direct call for reusability return "Error retrieving value"; } } } }
Custom URLRewriting with XML and Global.asax
utilizes my custom DocParser class here https://ronniediaz.com/2013/08/23/parse-xml-to-dynamic-expandoobject-c-net-4-0/
void Application_BeginRequest(object sender, EventArgs e) { //string path = Request.Url.ToString(); string path = Request.Path; if (Regex.IsMatch(path.ToLower(), ".*[.](jpg|png|gif|css|js|pdf|ico|woff|svg|eot|ttf)$")) { //var h = Regex.Replace(path.ToLower(), ".*/(.*)/(.*)$", "~/$1/$2", RegexOptions.Singleline); //Context.RewritePath(path); return; } //TODO: authorize user/request DocParser dp = new DocParser(Server.MapPath("~/rewrite.xml")); var rules = dp.GetElements("*/rule"); foreach (var r in rules) { if (string.IsNullOrEmpty(r.match_url)) { Shared.HandleError("Global.asax::null or empty match_url encountered"); } if (string.IsNullOrEmpty(r.action_url)) { Shared.HandleError("Global.asax::null or empty action_url encountered"); } if (Regex.IsMatch(path, r.match_url,RegexOptions.IgnoreCase)) { List<object> qsvars = new List<object>(); foreach (Match m in Regex.Matches(path, r.match_url, RegexOptions.IgnoreCase)) { for (int i=1;i<m.Groups.Count;i++) { qsvars.Add(m.Groups[i].Value); } } //Context.RewritePath(string.Format(r.action_url,qsvars.ToArray()) + "&rewrite=1"); Context.RewritePath(string.Format(r.action_url, qsvars.ToArray())); } } }
rewrite.xml examples
<?xml version="1.0" encoding="utf-8" ?> <rules> <rule match_url="^/home" action_url="~/home.aspx" /> <rule match_url="^/login" action_url="~/default.aspx" /> <rule match_url="^/register" action_url="~/welcome/register.aspx" /> <rule match_url="^/logout" action_url="~/logout.aspx" /> <rule match_url="^/default/(.*)" action_url="~/default.aspx?q={0}" /> <rule match_url="^/test/(.*)/(.*)" action_url="~/test.aspx?q={0}&r={1}" /> </rules>
Common functions asp .net static shared library
references custom encryption class here https://ronniediaz.com/2011/01/13/quick-net-encryption-reference/
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.Security; using System.Text; using System.Net; using System.IO; namespace AIS.Common { public static class Shared { //TODO: add local, dev, prd public static string basehref { get { return HttpContext.Current.Request.ApplicationPath; } } //TODO: change to json serialized object reference to prevent manipulation of pipe delimeters public static string SetSecureQueryString(object o) { string ct = Crypto.Rijndael.Encrypt(o.ToString(), "static_or_dynamic_string"); return HttpUtility.UrlEncode(ct); } //TODO: change to json (same as above) public static string SetSecureQueryString(object a, object b, object c, object d, object e, object f, object g, object h) { string ct = Crypto.Rijndael.Encrypt(a.ToString() + "|" + b.ToString() + "|" + c.ToString() + "|" + d.ToString() + "|" + e.ToString() + "|" + f.ToString() + "|" + g.ToString() + "|" + h.ToString(), "livestream"); return HttpUtility.UrlEncode(ct); } public static string GetSecureQueryString(string q) { try { //automatically decodes querystring in request return Crypto.Rijndael.Decrypt(q, "static_or_dynamic_string"); } catch (Exception ex) { return ""; } } //retrieves content from web url and returns as string public static string DownloadString(string url, NetworkCredential nc=null) { System.Net.WebClient wc = new WebClient(); if (nc != null) { wc.UseDefaultCredentials = true; wc.Credentials = nc; } return wc.DownloadString(url); } //http://mayur.gondaliya.com/programming-languages/c-sharp/samples/fetching-url-contents-into-a-string-using-httpwebrequest-72.html //same as above function, different approach with more detail public static string DownloadPage(string url) { const int bufSizeMax = 65536; // max read buffer size conserves memory const int bufSizeMin = 8192; // min size prevents numerous small reads StringBuilder sb; // A WebException is thrown if HTTP request fails try { // Create an HttpWebRequest using WebRequest.Create (see .NET docs)! HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = WebRequestMethods.Http.Get; // Execute the request and obtain the response stream HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); // Content-Length header is not trustable, but makes a good hint. // Responses longer than int size will throw an exception here! int length = (int)response.ContentLength; // Use Content-Length if between bufSizeMax and bufSizeMin int bufSize = bufSizeMin; if (length > bufSize) bufSize = length > bufSizeMax ? bufSizeMax : length; // Allocate buffer and StringBuilder for reading response byte[] buf = new byte[bufSize]; sb = new StringBuilder(bufSize); // Read response stream until end while ((length = responseStream.Read(buf, 0, buf.Length)) != 0) sb.Append(Encoding.UTF8.GetString(buf, 0, length)); return sb.ToString(); } catch (Exception ex) { sb = new StringBuilder(ex.Message); return sb.ToString(); } } //one approach using filesystem. will only work depending on permissions otherwise url parsing is needed public static string GetCurrentPageName() { string spath = System.Web.HttpContext.Current.Request.Url.AbsolutePath; System.IO.FileInfo oInfo = new System.IO.FileInfo(spath); string spagename = oInfo.Name; return spagename; } //get titlecase string public static string GetTitleCase(object str) { try { return System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToString().ToLower()); } catch (Exception ex) { Shared.HandleError(ex); return "Other"; } } #region handleerror public static void HandleError(Exception ex) { HandleError(ex.ToString()); } //TODO: send error to error handler public static void HandleError(string details) { SendEmail(details); } public static void HandleError(Page p, Exception ex) { HandleError(p, ex.ToString()); } public static void HandleError(Page p, string details) { //MessageBox.Show(hwnd, details); SendEmail(details); } //TODO: replace with call to error manager or hook to event for compatibility public static void SendEmail(string details) { //throw new HttpUnhandledException(details); if (Shared.GetCurrentPageName().Replace("/", "") != "error.aspx") //TODO: remove. temporary resolution for unhandled session timeouts. PROTOTYPE { //HttpContext.Current.Response.Redirect("~/error.aspx"); //TODO: global error log and local } } #endregion } }
Could not load type System.ServiceModel.Activation.HttpModule’ from assembly ‘System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=
If you already have .Net 4.0 installed and install a program that brings in an earlier version of .Net, or manually install an earlier version of .Net afterwards, you may get an exception page that matches the title of this article.
This is a simple fix, outlined in detail in MSDN article referenced at the bottom.
Navigate to:
%windir%\Microsoft.NET\Framework\v4.0.30319 %windir%\Microsoft.NET\Framework64\v4.0.30319 (on a 64-bit computer)
Run:
aspnet_regiis.exe /iru
That’s it!
asp .net repeater itemcommand command name common repeater control item operations
This is only one small snippet illustrating some functionality. I will add to this blog from my previous usage with Repeater control over time or per request.
In many deployments, I prefer to use Repeater or ListView rather than Grids. The code pattern is the same, but the output is slightly different as well as some of the inherent features/functionality.
Notice the example below simulates table output similar to a Grid, or it may also be used for non-table type of output. Repeater is therefore IMO more adaptable to different needs, and allows more re-usability code patterns across projects.
page side:
<asp:Repeater ID="rptRobotsInFactories" runat="server" OnItemCommand="rptRobotsInFactories_ItemCommand"> <HeaderTemplate> <table> <tr> <td>factory name</td> <td>robot name</td> <td>factory location</td> <td>manufacture date</td> <td colspan="2">commands</td> </tr> </HeaderTemplate> <ItemTemplate> <tr> <td> <%# Eval("factoryname")%> <asp:TextBox ID="tbRobotName" runat="server" Text='<%# Eval("robotname")%>'></asp:TextBox> </td> <td> <%# Eval("factorylocation")%> </td> <td> <%# Eval("manufacturedate")%> </td> <td> <asp:LinkButton ID="lbtnRename" runat="server"> CommandName="rename" CommandArgument='<%# Eval("robotname")%>'>rename</asp:LinkButton> </td> <td> <asp:LinkButton ID="lbtnDeelte" runat="server"> CommandName="delete" CommandArgument="">delete</asp:LinkButton> </td> </tr> </ItemTemplate> </HeaderTemplate> <FooterTemplate> <!-- insert pager here if you like--> </table> </FooterTemplate> </asp:Repeater>
code behind:
//you can also intercept item databind as i've listed in another previous article on nested repeaters protected void rptRobotsInFactories_ItemCommand(object sender, RepeaterCommandEventArgs e) { if (e.CommandName == "rename") { string newname = ((TextBox)rptRobotsInFactories.Items[e.Item.ItemIndex].FindControl("tbFileName")).Text; //string newname = ((TextBox)e.Item.FindControl("tbFileName")).Text; //equal to the above //string index = (string)e.CommandArgument; //useful to pass in index values also. can split the values passed in or pass in class obj //var rif = ((List<robotinfactory>)rptRobotsInFactories.DataSource)[e.Item.ItemIndex]; //var rif = Session_RobotsInFactories().Select(r=>r.id==Convert.ToInt32(e.CommandArgument)); //compare to using viewstate/page repeater above string oldname = (string)e.CommandArgument; if ((newname.ToLower().Trim().Replace(" ","") != "") && (newname!=oldname)) { //dowork_rename(oldname,newname); } } else if (e.CommandName=="delete") { robotinfactory rif = ((List<robotinfactory>)rptRobotsInFactories.DataSource)[e.Item.ItemIndex]; //dowork_delete(rif.id); } } //added below funcs for clarity public class robotinfactory() { public string factoryname {get;set;} public string robotname {get;set;} public string factorylocation {get;set;} public string manufacturedate {get;set;} } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //these would normally load from your LINQ dbml SP, view, select statement, stored procedure etc var rifs = new List<robotinfactory>(); rifs.Add(new rif { factoryname="a", robotname="bob", factorylocation="florida", manufacturedate="7/1/2013" }); rifs.Add(new rif { factoryname="b", robotname="sam", factorylocation="not florida", manufacturedate="7/4/2013" }); rptRobotsInFactories.DataSource = rifs; rptRobotsInFactories.DataBind(); } }
directory info get files show directories C# .Net
There is sometimes a misunderstanding between a “file” and a “folder” in filesystems. In C# .Net the following is often used to list all “files” in a folder.
DirectoryInfo di = new DirectoryInfo("yourpath"); foreach (FileInfo fi in di.GetFiles()) { //do work }
However, even though you can specify to search containing subdirectories, the above function will not inherently list folders. If you are looking for the equivalent to “dir” or “ls”, instead use “GetFileSystemInfos()”.
DirectoryInfo di = new DirectoryInfo("yourpath"); //note the difference here with getfilesysteminfos foreach (dynamic d in di.GetFileSystemInfos()) { }
Note the usage of dynamic in the above example compared to the first example. This avoids any potential issues with inheritance and choosing the right class for your temp iterator variable for unboxing etc.