Parallel.ForEach Async in C#

September 13th, 2019 No comments

As mentioned in my previous post, to get a ‘proper’ parallel foreach that is async is a bit of a pain

So the solution is to write a true async function

And you can call it …

Of course, you can refine it by adding check for tokens that cannot be cancelled as well as empty sources

First prize you must make sure that the body of the ForEach takes in the token and cancels cleanly otherwise this will jump out with thread left up in the air… but at least it will get out.

Edit: As someone pointed out to me on StackOverflow there are a couple of subtle ways I can improve my implementation … so I added them here

Categories: development Tags: , , ,

What happens when you throw an exception in Parallel Loops

September 11th, 2019 No comments

Bad things, bad things happen … explosions, tears … and maybe more

In the example above, the code will explode because of the exception.
So obviously we will add a try catch block…

And that will work, (of course)

But what if we want to run an async function in parallel … then what do we do?

In the case above you fire tasks, but don’t really wait for them to complete.
The async and await might give you the feeling that you are doing something truly in parallel … but you are not
Because Parallel.ForEach has no overload accepting a Func<Task>, it accepts only Action delegates.

The easy way out is to use Task as they were intended

Now obviously this is ugly code, but you get the idea … run all the tasks in parallel and wait for them all to finish.

Once they are all done, you can throw an aggregation of errors…. if there are any

Have a look at the code on my github page for more information/sample

Git authentification failed with no password prompt

August 28th, 2019 Comments off

Sometimes when trying to pull/push to a git repo, (on my own server or github), I get something like

fatal: Authentication failed for ‘https://….'”

Authentication failed

Now the problem is that I don’t even get asked for a username and password … sounds a bit stupid if you ask me.

On Windows 10:

  • Press Start, (the windows key)
  • Start typing “Credential Manager” or look for it in the control panel
  • Then select the Windows Credentials
  • Look for whatever website is the one that has your credentials
    Usually something like git:http://...
  • Remove the entry or edit it.
    If you remove it you will be asked for the credentials again.

Categories: development Tags: ,

What is the fastest lock in C#

August 26th, 2019 Comments off

I often wonder what the fastest lock is in C#.

If course they all have their own pros and cons, but when it comes to raw speed, what is the fastest lock.

We have a couple of options, but the common ones are

  • Lock object
  • Semaphore
  • Mutex
  • Read writer lock
    • Read
    • Write

The test was to add 10 million random numbers and test the various locks.

As this is not a multi threaded application, the waiting for the lock is imaterial here, we are only testing getting the lock.

In other words, this is an ideal scenario, you are not waiting for any lock, you are simply getting it.

Raw lock test

Obviously not getting any locks is faster, followed by both the ReaderWriterLockSlim, (read lock and write lock), then the SemaphoreSlim and the Mutex was, by far, the worse of them all.

  • The ReaderWriterLockSlim is slower because extra work is spent looking for re-entry as well as using a SpinLock
  • The SemaphoreSlim is even slower because we do a SpinWait and wait other threads to release the lock, (or locks as we could have more than one).
  • The mutex class is slower still because it puts the thread to sleep until it has access to the handle, and then wakes it up again.

You have a look at the code on my github page.

Categories: development Tags: ,

Delete a git branch local and remote

November 10th, 2018 Comments off

This is a continuation of my earlier post about pruning deleted branches

To delete a local branch 

or you can ‘force’ a delete if you have uncommitted changes
The -D is the same as --delete --force

To delete the branch remotely, simply do …

You can also do it like that if you prefer.

Again, you can use -d.

If you want to delete a remote and local branch, it is easier to first delete the remote branch and then the local branch.

You can then go ahead and prune all the branches.

Categories: Cheat-sheet, development Tags: , , ,

How to delete/prune old local git branches

October 27th, 2018 Comments off

When you delete a branch with git, and push those changes, you might see that your local repo still has that branch in the list

What this basically does is fetch all the branches and all the ones with a ‘gone’ attribute, (meaning deleted remotely), then we will remove them.

You can view the branches and what their attribute is yourself by typing

Of course, you need to prune the branches on the remote git server

To make sure all is good, just re-list your branches, (local and remote)

Categories: Cheat-sheet, development Tags: ,

How to unit test a config file, (ConfigurationSection)

June 17th, 2018 Comments off

To unit test a ConfigurationSection in c# you need to do a couple of thing in your unit test
Of course, we do not want to change anything in the assembly being tested.

  • Create your own ConfigurationSection class
  • ‘Fake’ your own configuration file.
  • Test that you have the expected behaviour
    • For required values
    • Optional values

In your test application, create your own configuration loader class
It uses your configuration section as a template.

Of course we also need to clean up things a little.
The file we created needs to be removed, you could also have this in your test teardown.

Creating the fake test file.

Now testing the config is fairly straight forward, (using NUnit in this case)

(using the sample config content, my parser does not escape it properl)

<?xml version=""1.0"" encoding=""utf-8""?>
<configuration>
<configSections>
<section name=""blah"" type=""BlahConfiguration,MyApp.Blah"" />
</configSections>
<blah>
</blah>
</configuration>

So now you can create your tests and just pass the values you want to test, default values for example, that values are loaded properly and so on.

Migrating from MSTest to NUnit

March 28th, 2018 Comments off

I am using VS2015 and VS2017 and I needed to migrate from Microsoft Unit tests to NUnit.

Those are the steps are followed.

  • In VS2015/2017 Select the “Package manager console” tab
    Select the correct project, (drop down combo), and type

  • Or using Nuget manager
    • Select the correct project.
    • Select NUnit, (just the plain ‘NUnit’ for now).
  • In your test project, look for “using Microsoft.VisualStudio.TestTools.UnitTesting;
    Replace with “using NUnit.Framework;“, (of course you will now have a whole bunch of errors.)
  • Look and replace
    • [TestClass] replace with [TestFixture]
    • [TestMethod] replace with [Test]
    • Remove code that looks like “[ExpectedException(typeof(xyz), “some text”)]” and surround the actual code that is expected to throw

NB: Note you might need to change a couple of other values

  • [TestInitialize] to [SetUp]
  • [TestCleanup] to [TearDown]
  • [TestClassInitialize] to [TestFixtureSetUp]
  • [TestClassCleanup] to [TestFixtureTearDown]

And a few other functions will need to change as well but for the most part they start with Assert.... and are fairly close(tm) to the Microsoft counterparts.

 

Deleting folders that refuse to be deleted…

September 13th, 2017 Comments off

Sometimes when you want to delete a folder in windows you get a very useful message “Could not find this item… this is no longer located in …”, (yes, the very item you just tried to delete).

So after a bit of cursing, making sure that you are indeed the admin of this box, praying to the windows gods you realise that maybe Windows Explorer is at fault.

Not to worry you think, you open up a cmd line console and navigate to the parent of the offending folder.

And like a true hacker you type

“rd c:\my\bad\folder”

only to be told once again, “The system cannot find the file specified.”

At this point your realise that the folder has spaces… so you think “no problem, I will quote the folder” and you now type

‘rd “c:\my\bad\folder “‘

with the correct number of spaces in the folder name.

Long story short… you cannot do that.

You cannot rename the folder, (I know you will try anyway, but you can’t)

So you Googled for a solution and here you are…

what you need to do is tell the command line to not trim the folder name and to do that, you have to add “\?\” in front, so now you type

‘rd /s /q “\\?\c:\my\bad\folder “‘

Complete with the extra spaces and so on… (I added the /s and /q flags because you forgot that the directory is not empty)

Debug Google test with Eclipse

August 13th, 2017 Comments off

You can add the google test library to Eclipse so you can compile the code, but you might want to actually build the whole thing at once without having to link libraries and whatever.

Of course this is possible as the full code is given to you…

  • Go to the Google Test Github project and download the latest release.
  • Unpack it whereever you want, and, of course make note of the project.
    We will call that folder <gfolder>
  • You then need to include the Google test file path, in eclipse,
    • The root of Google folder, “C/C++ build > Settings > Includes > Add include path” for <gfolder>
    • The include folder, “C/C++ build > Settings > Includes > Add include path” for <gfolder>, where the source files are included.

Then in you main( … ){ … } where you would normally include #include “gtest/gtest.h” or #include <gtest/gtest.h> add “#include “src/gtest-all.cc””

#include “src/gtest-all.cc”
#include “gtest/gtest.h”

int main(int argc, char** argv)
{
printf(“Running main() from gtest_main.cc\n”);
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}

Categories: development, Uncategorized Tags: