Archive for the ‘.NET’ Category.

Simple method for calling async method in standard function in C#

Due to a need to support older versions of .NET code and applications, you may find yourself staring at the need to call an async function from a standard synchronous function, and you don’t want to (or have the time for more likely) to go back and retrofit all of the calling functions with async/await functionality. Well brother, do I have a deal for you.

Here is how you can call the SendGrid SendEmailAsync function from within a regular C# function, and still be able to inspect the result of the task that runs the async method:

public bool SendPlainTextEmail(string subject, string body, List<string> toAddresses)
{
    try
    {
        var apiKey = "Nice try Chachi, go ahead and insert your own SendGrid API key here";
        var client = new SendGridClient(apiKey);
        var from = new EmailAddress("your_verified_sender_email_address@sbemail.com", "Your verified SendGrid email sender name here");
        var to = toAddresses.Select(x => new EmailAddress(x)).ToList();
        var msg = MailHelper.CreateSingleEmailToMultipleRecipients(from, to, subject, body, string.Empty);
 
        // Call the async function here and just wait for the results, no async function decorations required
        var task = Task.Run(async () => await client.SendEmailAsync(msg).ConfigureAwait(false));
        var result = task.Result.IsSuccessStatusCode;
        return result;
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

I leave it up to you, the reader, to adapt this code for your own purposes, nefarious or otherwise. Regardless, the important stuff is happening with these two lines, which I have boiled down from above to remove the SendGrid cruft:

var task = Task.Run(async () => await theAsyncMethod());
var result = task.Result;
// do something here with the result

In the interest of full disclosure, keep in mind you may need to do this import at or near the top of your source code file to be able to use the Task object in .NET:

using System.Threading.Tasks;

BTW, Happy Birthday to Seth MacFarlane, I can’t wait for season 3 of The Orville, March of 2022 can’t come soon enough.

Use ExecuteScalar to insert a database row and return the primary key

I suspect that just about every developer who has had to work with SQL Server has faced this issue. You need to insert a bunch of related records, some of which depend on other records being in the database first. I stumbled on a way to use ExecuteScalar to insert a database row and return the primary key with one call.

To do this, you just add this to the end of your INSERT statement:

SELECT Scope_Identity();

This SQL Server function returns the primary key of the last row that was added to the database with a primary key column. For my instance, I have a SqlText class that encapsulates a lot of the System.Data.Client functionality, so my code looks like this. (I have omitted most of the fields so that this code would be shorter.)

// table 'BillingAddresses' has an integer primary key, auto generated, identity
// 'addressLine1' below refers to a string variable containing line 1 of the address
var sqlString = "insert into BillingAddresses (Line1) values (@Line1); SELECT Scope_Identity();";
var newBillingAddressID = SqlText.ExecuteScalar(sqlString, new { Line1 = addressLine1 });

However, if you are using the standard System.Data.Client namespace, your code would then look like this:

// table 'BillingAddresses' has an integer primary key, auto generated, identity
// 'conn' below refers to an opened instance of a SqlConnection
// 'addressLine1' below refers to a string variable containing line 1 of the address
var sqlString = "insert into BillingAddresses (Line1) values (@Line1); SELECT Scope_Identity();";
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.Parameters.Add("@Line1", SqlDbType.VarChar);
cmd.Parameters["@Line1"].Value = addressLine1;
var newBillingAddressID = cmd.ExecuteScalar();

Mac Visual Studio Error: Address already in use

I have started to use the Mac version of Visual Studio more and more, and I must say I like it very much. But that does not mean it is not without its sharper edges.

Once in a while, when I am working on .NET web applications, something funky happens and when I try to run the project locally, I get the message:

Error: Address already in use

Here is how to fix this issue without having to go through some kind of insane reboot and/or ritual sacrifice.

First, find the process ID of the offending application in the terminal with this command, where you will replace 3306 with the port number that your local application runs on:

sudo lsof -iTCP -sTCP:LISTEN -P | grep :3306

This should give you the application and process ID (the first two items on the line) of the offender. Then, you enter this command, replacing 1234 with the second item from the data that the lsof command spit out:

kill -9 1234

BTW, Happy Belated 100th Birthday to the Grand Canyon. OK, not the actual canyon, but the National Park, which was designated such 100 years and 1 day ago. My advice to everyone is to stay at the El Tovar and eat breakfast at the restaurant, the sunrise is pretty astounding.

C# .NET simple Async Await example from console application Main

I did a couple of posts a few years back about doing async/await in VB.NET, and now I had need of doing something similar with a C# .NET console application.

Here is what I put together to get it working. This is the contents of the main class for a C# .NET console application, but you should be able to adapt the code to whatever need you have.

using System;
using System.Net.Http;
using System.Threading.Tasks;
 
namespace SimpleAsync
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Simple async");
 
            try
            {
                LengthyAsyncTask().Wait();
            }
            catch (Exception ex)
            {
                Console.WriteLine("There was an exception: " + ex.ToString());
            }
 
            Console.WriteLine("Press enter to quit application...");
            Console.ReadLine();
        }
 
        static async Task LengthyAsyncTask()
        {
            var response = await GetWebPage("https://www.dosomethinghere.com");
            Console.WriteLine("Response: " + response);
            // do something here with the response
        }
 
        static async Task<string> GetWebPage(string url)
        {
            var client = new HttpClient();
            var response = await client.GetAsync(url);
            var responseString = await response.Content.ReadAsStringAsync();
            return responseString;
        }
    }
}

BTW, Happy Anniversary to The Wall and Thriller, both seminal works of artistry from music’s golden age, released this day in 1979 and 1982, respectively. Darkness falls across the land… And how can you eat your pudding when you haven’t eaten your meat?

Visual Studio 2017 launches to a black or invisible screen, part 2

It turns out that disabling the Intel and Nvidia drivers on my Windows notebook computer are not really sufficient to fix the issue when Visual Studio 2017 launches to a black or invisible screen, as by doing this, I lost the ability to connect an external monitor to the HDMI port on the computer. Super bummer.

A bit more digging through the interwebs led me to this answer to a question on Stack Overflow:

White screen while opening visual studio

Basically, I re-enabled the Intel and Nvidia display options, then opened the Nvidia Control Panel by right-clicking on the desktop, selected Manage 3D Settings and changed the Preferred graphics processor selection from Auto-select to High-performance NVIDIA processor. Now everything is back to working the way I would like it to.

BTW, there are no birthdays today worthy of mention (cough, cough), so Happy International Left Handers Day!

Visual Studio 2017 launches to a black or invisible screen

So I am working along on a .NET project in Visual Studio 2017 on my Windows 10 Pro laptop, and all of a sudden when I launch the application, I get either a black window where the IDE should be, or the window area is transparent and I just see a shadow of the window edge. Very frustrating, as it was working fine the day before.

Finally I tracked it down to some kind of problem with a display driver. My laptop came preloaded with Intel and Nvidia display drivers and control panels, so I went into the computer management and disabled both the Intel and Nvidia display adapters. After rebooting, my screen still works, and magically I can see Visual Studio when I fire it up. Sure, there are some negatives to this, such as not being able to change the display resolution of the laptop panel, as the only choice in the dropdown is the native resolution of the panel. But at least I am able to once again get stuff done.

BTW, Happy Birthday to Joe Satriani. I hope Joe and the band make a tour stop somewhere near central Ohio soon. I saw the G3 tour last year in Cleveland, but there wasn’t enough Joe.

LINQ to SQL DBML file shows up as XML code in Visual Studio Community 2017

I have a project from a few years ago that I am looking back into again, and while it builds just fine in Visual Studio Community 2017, when I open the DBML file, I get a big XML file instead of a nice design surface with the data tables.

The solution to this issue is to install the correct component to handle this type of file. To do this, you need to exit Visual Studio IDE and then launch the Visual Studio Installer. Once there, click Modify, click the Individual components tab at the top, scroll down to the Code tools section, select LINQ to SQL tools so that there is a check mark next to it, and click the Modify button at the bottom right corner of the window. Once this finishes and you go back into Visual Studio, the DBML file should now show up as a design surface instead of XML source code.

BTW, a posthumous Happy Birthday to Gilda Radner, who left us far too soon.

Visual Studio Community 2017 crashes when running application

If you have Visual Studio Community 2017 and it crashes when you try running an application, I have heard that you can solve the problem by making sure that the .NET Framework 4.7.1 package is installed on your Windows machine.

BTW, Happy Birthday to the Great One, Wayne Gretzky.

Plain ol’ XML

So let’s say you are working on an application in the .NET sphere of influence, and you have an object that you want to turn into XML. However, you shoot it through an XmlSerializer and you think you are done.

Ugh, what’s all that cruft in the XML stream?

Well there are some options you can play with to get rid of the extra stuff and just get plain ol’ XML. Here is a code snippet, where you will pass in your own object instead of the generic Order as shown below:

public String GetPlainOldXML(Order order)
{
    var emptyNamepsaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
    var settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
 
    XmlSerializer xsSubmit = new XmlSerializer(typeof(Order));
    var xmlString = "";
    using (var sww = new StringWriter())
    {
        using (XmlWriter writer = XmlWriter.Create(sww, settings))
        {
            xsSubmit.Serialize(writer, order, emptyNamepsaces);
            xmlString = sww.ToString();
        }
    }
 
    return xmlString;
}

BTW, Happy Birthday to Leslie West of Mountain fame.

Error 404 on web service with map route

If you are getting an error 404 on your web service with a map route decorator on your methods, you might want to check your IIS settings to make sure that it is configured correctly.

Apparently, your app pool must be set up in integrated mode as opposed to classic mode in order for the routing to work.

BTW, Happy 10th Anniversary to the iPhone.