javascript

git

java

python

git-remote

reactjs

c++

github

django

c#

operators

git-fetch

typescript

user-experience

chmod

css

content-type

variables

var

loops

Haskell Thrift库在性能方面比C ++慢300倍

我正在构建一个包含两个组件的应用程序-用Haskell编写的服务器和用Qt(C ++)编写的客户端。 我正在节俭地与他们交流,我想知道为什么它这么慢。

我进行了性能测试,这是我的机器上的结果

结果

C++ server and C++ client:

Sending 100 pings                    -    13.37 ms
Transfering 1000000 size vector      -   433.58 ms
Recieved: 3906.25 kB
Transfering 100000 items from server -  1090.19 ms
Transfering 100000 items to server   -   631.98 ms

Haskell server and C++ client:

Sending 100 pings                       3959.97 ms
Transfering 1000000 size vector      - 12481.40 ms
Recieved: 3906.25 kB
Transfering 100000 items from server - 26066.80 ms
Transfering 100000 items to server   -  1805.44 ms

为什么Haskell在测试中这么慢? 如何提高性能?

这些是文件:

档案

性能节俭

namespace hs test
namespace cpp test

struct Item {
    1: optional string    name
    2: optional list<i32> coordinates
}

struct ItemPack {
    1: optional list<Item>     items
    2: optional map<i32, Item> mappers
}


service ItemStore {
    void ping()
    ItemPack getItems(1:string name, 2: i32 count) 
    bool     setItems(1: ItemPack items)

    list<i32> getVector(1: i32 count)
}

主站

{-# LANGUAGE ScopedTypeVariables #-}   
module Main where

import           Data.Int  
import           Data.Maybe (fromJust) 
import qualified Data.Vector as Vector
import qualified Data.HashMap.Strict  as HashMap
import           Network

-- Thrift libraries
import           Thrift.Server

-- Generated Thrift modules
import Performance_Types
import ItemStore_Iface
import ItemStore


i32toi :: Int32 -> Int
i32toi = fromIntegral

itoi32 :: Int -> Int32
itoi32 = fromIntegral

port :: PortNumber
port = 9090

data ItemHandler = ItemHandler

instance ItemStore_Iface ItemHandler where
    ping _                   = return () --putStrLn "ping"
    getItems _ mtname mtsize = do 
        let size = i32toi $ fromJust mtsize
            item i = Item mtname (Just $ Vector.fromList $ map itoi32 [i..100])
            items = map item [0..(size-1)]
            itemsv = Vector.fromList items 
            mappers = zip (map itoi32 [0..(size-1)]) items 
            mappersh = HashMap.fromList mappers
            itemPack = ItemPack (Just itemsv) (Just mappersh)
        putStrLn "getItems"
        return itemPack

    setItems _ _             = do putStrLn "setItems"
                                  return True

    getVector _ mtsize       = do putStrLn "getVector"
                                  let size = i32toi $ fromJust mtsize
                                  return $ Vector.generate size itoi32

main :: IO ()
main = do
    _ <- runBasicServer ItemHandler process port 
    putStrLn "Server stopped"

ItemStore_client.cpp

#include <iostream>
#include <chrono>
#include "gen-cpp/ItemStore.h"

#include <transport/TSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TBinaryProtocol.h>

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using namespace test;
using namespace std;

#define TIME_INIT  std::chrono::_V2::steady_clock::time_point start, stop; \
                   std::chrono::duration<long long int, std::ratio<1ll, 1000000000ll> > duration;
#define TIME_START start = std::chrono::steady_clock::now(); 
#define TIME_END   duration = std::chrono::steady_clock::now() - start; \
                   std::cout << chrono::duration <double, std::milli> (duration).count() << " ms" << std::endl;

int main(int argc, char **argv) {

    boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

    ItemStoreClient server(protocol);
    transport->open();

    TIME_INIT

    long pings = 100;
    cout << "Sending " << pings << " pings" << endl;
    TIME_START
    for(auto i = 0 ; i< pings ; ++i)
        server.ping();
    TIME_END


    long vectorSize = 1000000;

    cout << "Transfering " << vectorSize << " size vector" << endl;
    std::vector<int> v;
    TIME_START
    server.getVector(v, vectorSize);
    TIME_END
    cout << "Recieved: " << v.size()*sizeof(int) / 1024.0 << " kB" << endl;


    long itemsSize = 100000;

    cout << "Transfering " << itemsSize << " items from server" << endl;
    ItemPack items;
    TIME_START
    server.getItems(items, "test", itemsSize);
    TIME_END


    cout << "Transfering " << itemsSize << " items to server" << endl;
    TIME_START
    server.setItems(items);
    TIME_END

    transport->close();

    return 0;
}

ItemStore_server.cpp

#include "gen-cpp/ItemStore.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>

#include <map>
#include <vector>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;


using namespace test;
using boost::shared_ptr;

class ItemStoreHandler : virtual public ItemStoreIf {
  public:
    ItemStoreHandler() {
    }

    void ping() {
        // printf("ping\n");
    }

    void getItems(ItemPack& _return, const std::string& name, const int32_t count) {

        std::vector <Item> items;
        std::map<int, Item> mappers;

        for(auto i = 0 ; i < count ; ++i){
            std::vector<int> coordinates;
            for(auto c = i ; c< 100 ; ++c)
                coordinates.push_back(c);

            Item item;
            item.__set_name(name);
            item.__set_coordinates(coordinates);

            items.push_back(item);
            mappers[i] = item;
        }

        _return.__set_items(items);
        _return.__set_mappers(mappers);
        printf("getItems\n");
    }

    bool setItems(const ItemPack& items) {
        printf("setItems\n");
        return true;
    }

    void getVector(std::vector<int32_t> & _return, const int32_t count) {
        for(auto i = 0 ; i < count ; ++i)
            _return.push_back(i);
        printf("getVector\n");
    }
};

int main(int argc, char **argv) {
    int port = 9090;
    shared_ptr<ItemStoreHandler> handler(new ItemStoreHandler());
    shared_ptr<TProcessor> processor(new ItemStoreProcessor(handler));
    shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
    shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
    shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

    TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
    server.serve();
    return 0;
}

生成文件

GEN_SRC := gen-cpp/ItemStore.cpp gen-cpp/performance_constants.cpp gen-cpp/performance_types.cpp
GEN_OBJ := $(patsubst %.cpp,%.o, $(GEN_SRC))

THRIFT_DIR := /usr/local/include/thrift
BOOST_DIR := /usr/local/include

INC := -I$(THRIFT_DIR) -I$(BOOST_DIR)

.PHONY: all clean

all:   ItemStore_server ItemStore_client

%.o: %.cpp
    $(CXX) --std=c++11 -Wall -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H $(INC) -c $< -o $@

ItemStore_server: ItemStore_server.o $(GEN_OBJ) 
    $(CXX) $^ -o $@ -L/usr/local/lib -lthrift -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H

ItemStore_client: ItemStore_client.o $(GEN_OBJ)
    $(CXX) $^ -o $@ -L/usr/local/lib -lthrift -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H

clean:
    $(RM) *.o ItemStore_server ItemStore_client

编译并运行

我生成文件(使用此处的thrift 0.9):

$ thrift --gen cpp performance.thrift
$ thrift --gen hs performance.thrift

编译

$ make
$ ghc Main.hs gen-hs/ItemStore_Client.hs gen-hs/ItemStore.hs gen-hs/ItemStore_Iface.hs gen-hs/Performance_Consts.hs gen-hs/Performance_Types.hs -Wall -O2

运行Haskell测试:

$ ./Main& 
$ ./ItemStore_client

运行C ++测试:

$ ./ItemStore_server&
$ ./ItemStore_client

记住在每次测试后都要杀死服务器

更新资料

编辑了getVector方法以使用getItems代替Vector.fromList,但仍然无效

更新2

由于@MdxBhmt的建议,我测试了getItems函数,如下所示:

getItems _ mtname mtsize = do let size = i32toi $! fromJust mtsize
                                  item i = Item mtname (Just $!  Vector.enumFromN (i::Int32) (100- (fromIntegral i)))
                                  itemsv = Vector.map item  $ Vector.enumFromN 0  (size-1)
                                  itemPack = ItemPack (Just itemsv) Nothing 
                              putStrLn "getItems"
                              return itemPack

在我的原始实现的基础上,这是严格的,并且改进了Vector的生成,相对于其替代方法:

getItems _ mtname mtsize = do let size = i32toi $ fromJust mtsize
                                  item i = Item mtname (Just $ Vector.fromList $ map itoi32 [i..100])
                                  items = map item [0..(size-1)]
                                  itemsv = Vector.fromList items 
                                  itemPack = ItemPack (Just itemsv) Nothing
                              putStrLn "getItems"
                              return itemPack

请注意,没有发送HashMap。 第一个版本的时间为12338.2毫秒,第二个版本为11698.7毫秒,没有加速:(

更新3

我向Thrift Jira报告了一个问题

abhinav的Update 4

这是完全不科学的,但是使用带有Thrift 0.9.2的GHC 7.8.3和@MdxBhmt的版本getItems,可以大大减少差异。

C++ server and C++ client:

Sending 100 pings:                     8.56 ms
Transferring 1000000 size vector:      137.97 ms
Recieved:                              3906.25 kB
Transferring 100000 items from server: 467.78 ms
Transferring 100000 items to server:   207.59 ms

Haskell server and C++ client:

Sending 100 pings:                     24.95 ms
Recieved:                              3906.25 kB
Transferring 1000000 size vector:      378.60 ms
Transferring 100000 items from server: 233.74 ms
Transferring 100000 items to server:   913.07 ms

执行了多次执行,每次都重新启动服务器。 结果是可重现的。

请注意,原始问题的源代码(使用@MdxBhmt的getItems实现)将无法原样编译。 必须进行以下更改:

getItems _ mtname mtsize = do let size = i32toi $! fromJust mtsize
                                  item i = Item mtname (Just $!  Vector.enumFromN (i::Int32) (100- (fromIntegral i)))
                                  itemsv = Vector.map item  $ Vector.enumFromN 0  (size-1)
                                  itemPack = ItemPack (Just itemsv) Nothing 
                              putStrLn "getItems"
                              return itemPack

getVector _ mtsize       = do putStrLn "getVector"
                              let size = i32toi $ fromJust mtsize
                              return $ Vector.generate size itoi32
trans by 2020-08-12T08:06:03Z

使用Python进行字符转换(如tr命令)

有没有一种方法可以使用python进行字符翻译(类似于tr命令)

trans by 2020-08-12T08:01:04Z

在WCF中缓存?

我正在构建WCF服务。 我需要将参考数据存储在缓存中,每次从该方法接收输入时我都会对其进行查找...正确的方法是什么? 我还想为缓存定义一个过期策略,该策略将在一定时间间隔后使其失效。

trans by 2020-08-12T07:55:52Z

python-非阻塞子进程。

我试图进行一个非阻塞子进程调用,以从我的main.py程序中运行slave.py脚本。 当这个slave.py运行一段时间然后退出后,我需要通过main.py将args从main.py传递到slave.py一次。

main.py
for insert, (list) in enumerate(list, start =1):

    sys.args = [list]
    subprocess.call(["python", "slave.py", sys.args], shell = True)


{loop through program and do more stuff..}

还有我的奴隶脚本

slave.py
print sys.args
while True:
    {do stuff with args in loop till finished}
    time.sleep(30)

当前,slave.py阻止main.py运行其余任务,我只希望slave.py在将args传递给main.py之后独立于main.py。 这两个脚本不再需要通信。

我已经在网上找到了一些关于非阻塞subprocess.call的帖子,但是大多数帖子都集中在要求与slave.py进行某些当前我不需要的通信上。 有谁知道如何以简单的方式实现这一目标?

trans by 2020-08-12T07:54:04Z

C#开关大小写字符串以

有什么方法可以在switch语句中创建条件条件,即您说字符串是否以某些内容开头吗?

Switch (mystring)
{
   case("abc")://String begins with abc (abcd or abc1 or abcz or abc.. or abc will fall in this condition).
      //Do Something
      break;
   default:
      break;
}

更新其他字符串的长度可以不同。

abc ..

abczyv

分解。

qwerty

trans by 2020-08-12T07:49:45Z

目标c-iOS 11大标题导航栏不折叠

“在Cocoa Touch WWDC中的新增功能”视频中的苹果人说,新的大标题导航栏将神奇地挂接到基础视图控制器的顶级滚动视图中,并在上下滚动时自动折叠/扩展自身。 (通过“魔术”,他可能意味着他们无法以一种有用的方式将这个功能猴子化到已经令人尴尬的UINavigationController-UITabBarController-UINavigationController API中,因此他们不得不诉诸于幕后的启发式选择的滚动视图)

即使我准备好如果我稍微偏离基本的3007829921571013613632 + UINavigationController/3007829921571071013634,这种“自动”折叠/展开也不起作用,即使在这种最简单的情况下,它似乎也无法按预期工作。

这是我所拥有的:

一个UITabBarController包含一个UINavigationController,一个UIViewController和一个UITableView作为其3007829921571013665。点击表中的第一个单元格将在导航堆栈上推送第二个视图控制器:

storyboard

没有代码,只有情节提要。

我已选中导航栏的“首选大标题”以激活大标题。 现在,如果我运行该应用程序并在表格视图上向上/向下滚动,则导航栏保持不变-大-尺寸; 它不会崩溃:

stuck with large title

但是,我发现如果将第二个视图控制器的导航项设置为使用小的导航栏(通过将“大标题”设置为值“从不”),则如果我打开该页面并向后浏览,则交互式折叠 神奇地开始在第一页上工作:

interactive collapse works after back navigation

我在这里缺少什么,还是此功能无法正常工作? 这是我正在使用的示例项目:[https://github.com/tzahola/iOS-11-Large-Title-Navigation-Bar]

顺便说一句,我使用的是正式发布的iOS 11,而不是Beta。

2017年9月23日更新:我已向Apple发送错误报告,并在openradar.me上打开了一张票证:[http://www.openradar.me/radar?id=5017601935671296]

trans by 2020-08-12T07:46:21Z

visual studio 2010-使用msbuild构建解决方案文件

我正要使用msbuild来构建Visual Studio解决方案文件。 我使用以下命令行来构建解决方案

msbuild.exe SolutionFile.sln /t:Build/p:Configuration=Release;Platform=Win32

即使构建从某个时候开始,构建仍处于挂起状态,无法继续前进,如下所示

Done Building Project "D:\SolutionPath\ProjectFile10.vcxproj" (default targets).

在我必须构建的msbuild.exe下有很多.proj

我必须使用msbuild.exe而不是3007828193148668661

trans by 2020-08-12T07:44:09Z

svn-使用Subversion的有用工具

有很多很棒的工具可以与Subversion集成在一起,并且可以做一些真正的整洁的事情。 我尝试了许多方法,但最终仅倾向于定期使用以下方法:

  1. Tortoise(无处不在的Explorer插件)
  2. Visual SVN(VS的IDE集成)
  3. Visual SVN服务器(轻量级SVN服务器)
  4. SVN Monitor(存储库监视)

还有什么可以与Subversion交互的真正创新或有用的东西呢?

trans by 2020-08-12T07:35:11Z

嵌入式-高效软件编码

在典型的手持/便携式嵌入式系统设备中,电池寿命是H / W,S / W和设备可以支持的功能设计中的主要问题。 从软件编程的角度来看,人们知道MIPS,内存(数据和程序)优化的代码。我知道H / W深度睡眠模式,即待机模式,可用于以较低的周期为硬件计时或将时钟整体转向一些未使用的电路以节省功耗,但我正在从这一角度寻找一些想法 :

在我的代码正在运行且需要继续执行的地方,鉴于此,我如何才能有效地编写代码“电源”以消耗最小的瓦特?

我是否应该查看任何特殊的编程结构,数据结构,控制结构,以实现给定功能的最低功耗。

在进行代码结构设计时或在进行低级设计时,是否应考虑任何软件高级设计注意事项,以使代码尽可能高效(省电)?

trans by 2020-08-12T07:24:37Z

Chrome和Safari中jQuery UI对话框的滚动条问题

我使用的是带有modal=true的jQuery UI对话框。在Chrome和Safari中,这会禁用通过滚动条和光标键的滚动(使用鼠标滚轮和页面上/下滚动仍然有效)。

如果对话框太高而无法容纳在一页上,这将是一个问题-笔记本电脑上的用户会感到沮丧。

三个月前有人在jQuery Bug跟踪器上提出了这个问题-[http://dev.jqueryui.com/ticket/4671]-似乎不应该解决它。 :)

任何人也是如此:

  1. 有解决办法吗?
  2. 有建议的解决方法可以提供良好的可用性体验?

我正在尝试将mouseover / scrollto用于表单的某些位,但这不是一个很好的解决方案:(

编辑:罗恩·比尼杰(Rowan Beentje)的道具(他不在SO afaict上),以寻求解决方案。 jQuery UI通过捕获mouseup / mousedown事件来防止滚动。 因此,以下代码似乎可以解决此问题:

$("dialogId").dialog({
    open: function(event, ui) {
        window.setTimeout(function() {
            jQuery(document).unbind('mousedown.dialog-overlay')
                            .unbind('mouseup.dialog-overlay');
        }, 100);
    },
    modal: true
});

使用时,后果自负,我不知道解除绑定这些东西可能会导致哪些其他非模态行为。

trans by 2020-08-12T07:19:37Z

gerrit-git(pull vs checkout vs cherrypick)这是做什么用的?

在Android的gerrit ex:链接中,要下载补丁,我看到4个选项。

  1. 回购下载
  2. 退房
  3. 樱桃采摘

它们之间有什么区别?

这就是我对它们的看法。 请澄清

  1. repo download->下载完整的源代码(项目中所有git repos的源代码),直到提交
  2. 结帐->不知道是什么。
  3. 拉->不知道它做什么?
  4. cherry-pick->它尝试仅下载此更改并将其合并到源代码中。

我知道pull和checkout与Cherry-pick不同。 但是它们有什么不同?

trans by 2020-08-12T07:16:52Z

c ++-标准对如何在向量上调用clear改变容量有何看法?

该网站暗示清除媒介可能会改变容量:

[HTTP://恩.CPP reference.com/我/CPP/container/vector/clear]

许多实现不会在调用后释放分配的内存 清除(),有效地保留向量的容量() 不变。

但是根据@JamesKanze所说,这是错误的,明确的标准要求不会改变容量。

标准怎么说?

trans by 2020-08-12T07:15:01Z

您可以在解决方案中混合使用.NET Framework版本吗?

我工作的代码库是.NET 2.0。 对于我们的新程序集/ DLL / Web应用程序,我想利用3.5提供的功能。

一个解决方案中可以混合使用.NET框架(按程序集)吗? 是否有与IIS相关的警告?

我很想听听任何正面/负面/如何反馈。 让我知道!

谢谢!

trans by 2020-08-12T07:11:08Z

.net-TransactionScope和多线程

我想知道在处理多线程时如何正确使用TransactionScope类?

我们在主线程中创建一个新的作用域,然后生成几个工作线程,并希望它们参与主作用域,例如,如果该作用域从未完成,则在每个工作线程上调用回滚。

我在内部使用ThreadStaticAttribute读取了有关TransactionScope的内容,这使上述操作变得不可能/非常困难-有人可以验证这两种方法吗? 如果我们以同步的方式用完代码,那么回滚将起作用,即内部事务能够参与主事务,但是如果我们切换到线程执行则不能。

谢谢

trans by 2020-08-12T07:09:27Z

python-在__main__.py中使用模块自己的对象

我正在尝试从其__main__.py内部访问模块的数据。

结构如下:

mymod/
    __init__.py
    __main__.py

现在,如果我在foo中公开这样的变量:

__all__ = ['foo']
foo = {'bar': 'baz'}

如何从__main__.py访问foo

trans by 2020-08-12T07:05:50Z

为什么我看不到大多数高级语言的管道运算符?

在Unix Shell编程中,管道运算符是一个非常强大的工具。 使用少量的核心实用程序,系统语言(如C)和脚本语言(如Python),您可以构建极其紧凑且功能强大的Shell脚本,这些脚本将由操作系统自动并行化。

显然,这是一个非常强大的编程范例,但是我没有将管道视为除Shell脚本之外的任何语言的第一类抽象。 使用管道复制脚本功能所需的代码似乎总是很复杂。

所以我的问题是,为什么在现代高级语言(如C#,Java等)中看不到类似于Unix管道的东西? 是否有支持一流管道的语言(shell脚本除外)? 这是一种表达并发算法的方便,安全的方法吗?

以防万一有人提出它,我看了看F#管道转发运算符(forward pipe operator),它看起来更像是函数应用程序运算符。 据我所知,它对数据应用了一个函数,而不是将两个流连接在一起,但是我可以接受更正。

后记:在研究实现协程的同时,我意识到存在某些相似之处。 马丁·沃尔夫(Martin Wolf)在一篇博客文章中描述了一个与我类似的问题,只是用协程而不是管道。

trans by 2020-08-12T06:57:47Z

android-有关Google Play应用程序资产加密的问题

从v4.1 Jelly Bean开始,Google为Google Play引入了新的应用程序资产加密功能。 似乎在升级应用程序时会出现一些问题,其中包括由于apk目录中的更改而导致重启后丢失的持久数据(旧版本为/data/app,现在为/mnt/asec)。

因此,在适用于OS 2.3+的Google Play上发布(或更新已发布的应用)时,

  • 我可以禁用此选项并发布未加密的应用程序吗?
  • 问题的当前状态是什么? 有解决方法吗?

除了这个问题,提供额外的防止盗版保护的想法似乎还可以,但是我在文档中的任何地方都找不到一些其他注意事项:

  • 发布到备用商店或通过OTA部署的应用程序如何处理? 它们也可以加密吗? 如果不是,那么如果有人可以从其他地方下载未加密的apk并立即对其进行反编译,那么在Google Play发布中造成如此大痛苦的意义何在?
  • 扎根手机能打败它吗?
  • OS 4.0+附带的apk是唯一具有保护的apk吗? 如果是这样,那么,如果有人可以将未加密的apk下载到Gingerbread手机,并使用adb将其拉出并以通常的方式进行反编译,那又有什么意义呢?
  • 假设该机制有效:备份应用程序(如Titanium Backup)如何,或者使用adb进行手动apk备份呢? 他们还会继续工作吗?
  • 性能:某些应用可能具有相当大的apk大小。 这种机制会影响性能吗? 操作系统每次加载时都会解密整个apk吗?

提前致谢

更新:
编辑以包括指向Google Code问题的链接。
问题34880(已关闭,但仍有一些开发人员在抱怨;状态:未来版本)
发行35962(已关闭;状态:已发布)

更新#2:
在第一期中,由一名开发人员链接的有关此博客文章的有趣信息。 也是这里德语。

用户和开发人员报告说,在最近几天中,使用最新版本的Google Play(3.7.15)安装的应用程序问题似乎消失了。 先前已安装有问题的应用程序的用户将需要卸载,然后免费重新下载它们。 根据一份报告,新版本的Google Play现在将付费应用再次保存到/ data / app,这意味着Google现已停用了复制保护功能。 Google尚未对此问题发表公开评论。 该错误被标记为中等优先级,其状态为“ FutureRelease”(可能为修复)。

trans by 2020-08-12T06:23:49Z

CodeGo.net>如何写在中等信任的Web.Config?

将我的第一个大小合适的Web应用程序上载到共享主机,这给我带来了一系列新的挑战,我的意思是不眠之夜。 问题是我最肯定没有开发我的中等信任度应用程序(或有任何线索)。

我解决了所有问题,保存了一个。

我已经为管理员编写了一个安装程序,以能够指定其连接字符串和其他首选项,但是我找不到以中等信任度写入web.config的方法。 有没有人有解决方案,还是我应该将偏好设置放在另一个文件中?

trans by 2020-08-12T06:20:27Z

C#|| 运算符不使用可为空的布尔值

我的LINQ中有以下代码:

    where (tf.Shipped || tf.Ordered || tf.Processed)

请注意,“已发货”,“已订购”和“已处理”都是可空的布尔字段

我收到以下消息:

运算符|| 不能应用于类型为“布尔”的操作数? 和“布尔?”

不确定如何将其解决,因为它们需要为可为null的布尔值,而我需要使用OR(||)。

trans by 2020-08-12T06:16:59Z

unix-是否可以在Linux上中止关机?

我熟悉并在Linux中使用shutdown,通常只是

> shutdown -h now

但是有没有办法阻止关闭发生,比如说我打算从现在开始10分钟关闭,然后在5分钟内发现我真的不想关闭?

trans by 2020-08-12T06:14:37Z

上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 下一页 共4258页