从写博客,博文当成一件学习,工作总结,到逐渐看到同行工作经历,感想,颇为熟悉亲切,颇觉有趣之感,
言归正传:起因是最近看腾讯课堂一位老师的讲解,加上自己的查找官方权威说明,对一直在写的C#代码,有了更加清楚的认识,
先说结论:也是一段这几天的收获
第一:C#是面向对象的编程语言,同时也是支持组件开发,后面一句话很多人忽视
仔细品这句哈,面向组件开发的语言
https://docs.microsoft.com/zh-cn/dotnet/csharp/tour-of-csharp/
第二:C#也存在版本,但是我很多人忽视这一点,它的版本和vs存在绑定关系
另外它的版本,和.NET版本没有直接关系
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
这篇文章说明了,C#版本从1.0到7.0
关于C# 7.0 C#7.3 C#8.0之间区别在这里,换句话说,新增什么语法,
写代码增加那些写法,见如下:
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7-3
第三:什么是.NET ?它和C#什么关系?和NET Framework以及NET Core什么关系?
C#是一门编程语言,而.NET则是框架集,相当于一个统称,而比较典型,熟知的框架集
是.NET Framework .NET Core,重点理解,.NET不仅仅是支持C#语言,还支持F#等等
https://dotnet.microsoft.com/learn/dotnet/what-is-dotnet
第四:.NET Framework和.Net Core什么关系?并列关系,关于他们之间区别
请看这里https://docs.microsoft.com/zh-cn/dotnet/standard/choosing-core-framework-server
using System;
using System.Threading;
namespace ThreadMaxTestCore
{
class Program
{
public delegate void a();
static object lockObj = 1;
private static void PrintThreadInfo(string info)
{
//使用的时候记得Lock一下,因为线程的创建和销毁是时刻在变的.
lock (lockObj)
{
Console.WriteLine(info);
Console.WriteLine($"当前线程ID:{Thread.CurrentThread.ManagedThreadId}");
Console.WriteLine($"是否是背地里运行的线程ID(后台线程):{Thread.CurrentThread.IsBackground}");
int workerThread = 0;
int ioThread = 0;
ThreadPool.GetMaxThreads(out workerThread, out ioThread);
Console.WriteLine($"线程池内最大工作线程:{workerThread},最大io线程:{ioThread}");
int workerThreadA = 0;
int ioThreadA = 0;
ThreadPool.GetAvailableThreads(out workerThreadA, out ioThreadA);
Console.WriteLine($"线程池内最大可用线程:{workerThreadA},最大可用io线程:{ioThreadA}");
//Console.ReadLine();
//这个方法执行完,到x.BeginInvoke()会报错,.Net core没有支持这个方法
}
}
static void Main(string[] args)
{
PrintThreadInfo("main函数打印");
//
a x = new a(()=> {
//方法里面执行代码
PrintThreadInfo("我是异步调用");
});
/*
* 使用 .NET Framework 可以以异步方式调用任何方法。
* https://docs.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/calling-synchronous-methods-asynchronously
* 要实现此操作,请定义一个委托,此委托具有与你要调用的方法相同的签名;公共语言运行时会自动使用适当的签名为此委托定义 BeginInvoke 和 EndInvoke 方法。
*/
x.BeginInvoke(null,null);
}
}
}
/*
net core框架集控制台输出 input:
main函数打印
当前线程ID:1
是否是背地里运行的线程ID(后台线程):False
线程池内最大工作线程:32767,最大io线程:1000
线程池内最大可用线程:32766,最大可用io线程:1000
Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
at ThreadMaxTestCore.Program.a.BeginInvoke(AsyncCallback callback, Object object)
at ThreadMaxTestCore.Program.Main(String[] args) in D:\vs_workspace\ThreadMaxTestCore\Program.cs:line 44
net framework框架集下控制台输出 input:
main函数打印
当前线程ID:1
是否是背地里运行的线程ID(后台线程):False
线程池内最大工作线程:2047,最大io线程:1000
线程池内最大可用线程:2047,最大可用io线程:1000
我是异步调用
当前线程ID:3
是否是背地里运行的线程ID(后台线程):True
线程池内最大工作线程:2047,最大io线程:1000
线程池内最大可用线程:2046,最大可用io线程:1000
请按任意键继续. . .
*/
/*
net core框架集控制台输出 input:
main函数打印
当前线程ID:1
是否是背地里运行的线程ID(后台线程):False
线程池内最大工作线程:32767,最大io线程:1000
线程池内最大可用线程:32767,最大可用io线程:1000
Unhandled exception. System.PlatformNotSupportedException: Operation is not supported on this platform.
at ThreadMaxTestCore.Program.a.BeginInvoke(AsyncCallback callback, Object object)
at ThreadMaxTestCore.Program.Main(String[] args) in D:\vs_workspace\ThreadMaxTestCore\Program.cs:line 44
net framework框架集下控制台输出 input:
main函数打印
当前线程ID:1
是否是背地里运行的线程ID(后台线程):False
线程池内最大工作线程:2047,最大io线程:1000
线程池内最大可用线程:2046,最大可用io线程:1000
我是异步调用
当前线程ID:3
是否是背地里运行的线程ID(后台线程):True
线程池内最大工作线程:2047,最大io线程:1000
线程池内最大可用线程:2046,最大可用io线程:1000
请按任意键继续. . .
*/
非常明显,.net core框架集项目下,用都是C#语法,支持BeginInvoke写法,
但是没有实现它,但.net framework就没有问题
个人理解是: 基本上Net Framework代表现在,Net Core代表未来,
基本上,微软是一直在更新C#语言语法规范的,和框架集合的,因此功能越来越强大,我们个人也是要不断学习