1.mscorlib.dll
解析:多语言标准通用对象运行时库[Microsoft Standard Common Object Runtime Library]。
2.异步和多线程
解析:
[1]异步是线程的一种应用,多线程也是线程的一种应用。
[2]异步不仅不是多线程,同时异步也不一定会使用多线程。
3.Task.Wait()
解析:
[1]Task.Wait()是一个同步方法,用于多线程中阻塞等待,不是实现同步方法中调用异步方法的实现方式。
[2]Task是Thread的子集,继承了Wait方法,但这个方法不是给异步用的。
4.int result = await f;
解析:如果没有完成,则程序将继续执行这个方法直到得到结果。然后再执行这个函数后面的代码。
5.同步方法中调用异步
解析:func1().GetAwaiter().GetResult();
6.C#异步编程
解析:
[1]C#中,异步编程,一个核心,两个关键字。
[2]一个核心是指Task和Task<T>对象,而两个关键字,就是async和await。
7.异步编程–单线程模式
解析:
Task<string> GetHtmlAsync()
{
var client = new HttpClient();
var gettask = client.GetStringAsync("https://home.cnblogs.com/u/tiger-wang");
return await gettask;
}
这种方式不额外占用线程池资源,也不需要考虑多线程开发中线程锁定、数据一致性等问题。因为线程没有切换,所以也不存在上下文切换的问题。
8.异步编程–多线程模式
解析:
Task<string> GetHtmlAsync()
{
var gettask = Task.Run(() => {
var client = new HttpClient();
return client.GetStringAsync("https://home.cnblogs.com/u/tiger-wang");
});
return await gettask;
}
Task.Run的内部代码会占用线程池资源,并在一个可用的线程上与主线程并行运行。
9.异步额外状态–取消
解析:
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken cancel_token = source.Token;
await ActionAsync(para, cancel_token);
source.Cancel();
10.异步额外状态–进度
解析:
public class Progress<T> : IProgress<T>
{
public Progress();
public Progress(Action<T> handler);
protected virtual void OnReport(T value);
public event EventHandler<T> ProgressChanged;
}
IProgress<T>通过回调来发送进度值,引发捕获并处理。
11.线程同步
解析:线程之间采用互斥或者信号量等方式进行同步。
12.Task本质
解析:Task是一个所谓的调度单位,每个异步任务被封装为一个Task在CLR中被调度,而Task本身会运行在CLR中的预先分配好的线程池中。
13.await必须配合Task/ValueTask才能用吗
解析:在C#中只要类中包含GetAwaiter()方法和bool IsCompleted属性,并且GetAwaiter()返回的东西包含一个GetResult()方法、一个bool IsCompleted属性和实现了INotifyCompletion,那么这个类的对象就是可以await的。
说明:CLR:https://github.com/dotnet/runtime
14.托管代码和非托管代码
解析: 托管代码和非托管代码
15.C#判断List集合是否为空
解析:
[1]当集合是来自不确定个数的IEnumerable<T>时,使用Any()。
[2]当集合是来自外部数据[LINQ to SQL、LINQ to Entities]时,使用Any()。
[3]当集合是来自.NET Framework内建的集合时,使用Count()。
16.IWebDriver
解析:浏览器驱动接口,所有的关于浏览器的操作都可以通过此接口进行,不同浏览器有不同的实现类,比如IE浏览器[InternetExplorerDriver]、Chrome浏览器[ChromeDriver]等。
17.BackgroundWorker
解析:后台工作线程,区别于主线程,通过事件触发不同的状态。
18.log4net
解析:主要用于日志的记录和存储,采用log4net进行日志记录,便于过程跟踪和问题排查。
19.C#获取路径
解析:
[1]获取程序的基目录
System.AppDomain.CurrentDomain.BaseDirectory
[2]获取模块的完整路径
System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
[3]获取和设置当前目录[该进程从中启动的目录]的完全限定目录
System.Environment.CurrentDirectory
[4]获取应用程序的当前工作目录
System.IO.Directory.GetCurrentDirectory()
[5]获取和设置包括该应用程序的目录的名称。
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
[6]获取启动了应用程序的可执行文件的路径
System.Windows.Forms.Application.StartupPath
[7]获取启动了应用程序的可执行文件的路径及文件名
System.Windows.Forms.Application.ExecutablePath
C#获取路径的相关方法,如下所示:
Assembly.GetEntryAssembly().Location
Assembly.GetAssembly().Location
Assembly.GetCallingAssembly().Location
Assembly.GetExecutingAssembly().Location
20.AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath区别
解析:
[1]AppDomain.CurrentDomain.BaseDirectory返回结果为D:\xxx\,而Application.StartupPath返回结果为D:\xxx
[2]Application.StartupPath只能用于WinForm窗体中,而AppDomain.CurrentDomain.BaseDirectory既可以用于WinForm窗体中,也可以用于类库DLL文件中。
21.PSD文件
解析:psd格式[Photoshop Document]的文件是一种图形文件格式,因此使用看图软件如ACDSee或图形处理软件如我形我速、PhotoShop等都可以打开的。
22.System.Environment.Exit
解析:
[1]System.Environment.Exit(1)程序非正常运行导致退
[2]System.Environment.Exit(0)程序正常运行退出
23.代理过程
解析:
[1]生成自定义代理类
delegate int MyDelegate();
[2]用New运算符实例化代理类
MyDelegate d = new MyDelegate(MyClass.MyMethod);
[3]最后通过实例对象调用方法
int ret = d();
[4]在程序中像调用方法一样应用代理的实例对象调用它指向的方法
delegate int d(int I);
说明:在C#中,一个类可以继承一个基类,但是可以实现多个接口。
24.SequenceEqual集合相等
解析:SequenceEqual扩展方法用于比较集合系列各个相同位置的元素是否相等。如下所示:
int[] a = new int[] {1, 2, 3};
int[] b = new int[] {1, 2, 3};
int[] c = new int[] {1, 3, 2};
bool result1 = a.SequenceEqual(b); // true
bool result2 = a.SequenceEqual(c); // false
25.C#5种可访问性类型
解析:
[1]public:成员可以从任何代码访问。
[2]protected:成员只能从派生类访问。
[3]internal:成员只能从同一程序集的内部访问。
[4]protectedinternal:成员只能从同一程序集内的派生类访问。
[5]private:成员只能在当前类的内部访问。