MrAdvice: Release assembly with weaved Task function crashes

Hi, another interesting bird. I add the complete, as simple as possible, project emulating bug. When you start it from VS in Debug mode - works, when you start exe from DEBUG folder - works. When you start it from VS in Release mode or exe from from RELEASE folder - crashes. with Critical error (the same as in previous bug).

TestAsync.zip

Both not working neither async function calling async Task nor sync calling async

//Fatal error
 public void StartTask()
            {
                var task = System.Threading.Tasks.Task.Run(async () => await AddWhatever());
                var r = task.Result;                
            }

//Fatal error
            public async void StartTask1()
            {
                long r = await AddWhatever();
            }


 public async System.Threading.Tasks.Task<long> AddWhatever()
            {
                return -1;
            }

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Comments: 42 (16 by maintainers)

Most upvoted comments

The PdbAsyncMethod instance is in: body.PdbMethod.AsyncMethod

In that case, you need to update all PdbAsyncMethod.StepInfos. The BreakpointMethod field must be updated to the new method.

Works in the latest version! image

I think the journey not finished yet, it compiles, but this function that contains Task.Run(async () => await _M._Users.AddUser fails to be run in RELEASE MODE

here is the ILDump


public string Yadro_CompaniesAndUser_AddUser(string callerAddIn, List<string> args)
{
	return (string)⚡Invocation.ProceedAspect(this, new object[]
	{
		callerAddIn,
		args
	}, methodof(RemoteInterfacesImplementer.Yadro_CompaniesAndUser_AddUser(string, List<string>)).MethodHandle, methodof(RemoteInterfacesImplementer.Yadro_CompaniesAndUser_AddUser′(string, List<string>)).MethodHandle, methodof(RemoteInterfacesImplementer.Yadro_CompaniesAndUser_AddUser″(object, object[])).MethodHandle);
}
[ExecutionPoint]
private string Yadro_CompaniesAndUser_AddUser′(string callerAddIn, List<string> args)
{
	RemoteInterfacesImplementer.<>c__DisplayClass30_0 <>c__DisplayClass30_ = new RemoteInterfacesImplementer.<>c__DisplayClass30_0();
	<>c__DisplayClass30_.args = args;
	try
	{
		string result;
		if (callerAddIn != "GM_UserManagement")
		{
			result = "-1";
			return result;
		}
		result = Task.Run<long>(delegate
		{
			RemoteInterfacesImplementer.<>c__DisplayClass30_0.<<Yadro_CompaniesAndUser_AddUser>b__0>d <<Yadro_CompaniesAndUser_AddUser>b__0>d;
			<<Yadro_CompaniesAndUser_AddUser>b__0>d.<>4__this = <>c__DisplayClass30_;
			<<Yadro_CompaniesAndUser_AddUser>b__0>d.<>t__builder = AsyncTaskMethodBuilder<long>.Create();
			<<Yadro_CompaniesAndUser_AddUser>b__0>d.<>1__state = -1;
			AsyncTaskMethodBuilder<long> <>t__builder = <<Yadro_CompaniesAndUser_AddUser>b__0>d.<>t__builder;
			<>t__builder.Start<RemoteInterfacesImplementer.<>c__DisplayClass30_0.<<Yadro_CompaniesAndUser_AddUser>b__0>d>(ref <<Yadro_CompaniesAndUser_AddUser>b__0>d);
			return <<Yadro_CompaniesAndUser_AddUser>b__0>d.<>t__builder.Task;
		}).Result.ToString();
		return result;
	}
	catch (Exception ex)
	{
		_Log.AddCoreException("GpsCarControl.Server.CoreAsModule.RemoteInterfacesImplementer", "Yadro_CompaniesAndUser_AddUser", ex, "");
	}
	return "-1";
}
private static object Yadro_CompaniesAndUser_AddUser″(object obj, object[] array)
{
	return ((RemoteInterfacesImplementer)obj).Yadro_CompaniesAndUser_AddUser′((string)array[0], (List<string>)array[1]);
}

I’m sorry, this is (again) a logging problem, which I’m going to fix once for all in a dependency project. Until there, it should be fixed in 2.5.16.